You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中withAnimation(.linear)的duration参数调整无效果如何解决?

SwiftUI 线性动画duration参数不生效问题解答

根本原因

你遇到的现象不是系统的有意设计,属于withAnimation API的用法错误:

  • withAnimation的作用是包裹状态变更的逻辑,系统会对该状态变更关联的所有视图变化应用指定动画参数
  • 你当前把withAnimation放在了body的视图构建分支内包裹目标视图,系统不会读取这个位置传入的动画参数,因此无论设置多大的duration都不会生效

正确实现方式

方案1:在状态变更处使用withAnimation

将withAnimation移到Button的action闭包中,包裹修改show状态的代码即可,示例如下:

struct ButtonView: View {
    @State var show: Bool = false
    var body: some View {
        ZStack{
            if show {
                CollapsibleView()
            }
        }
        Button(action: {
            // 在这里包裹状态变更逻辑
            withAnimation(.linear(duration: 50)) {
                show.toggle()
            }
        }) {
            Text("Press Me")
        }
    }
}

struct CollapsibleView: View {
    var body: some View {
        VStack {
            Text("Text 1")
            Text("Text 2")
            Text("Text 3")
        }
    }
}

@main
struct app: App {
    var body: some Scene {
        WindowGroup {
            ButtonView()
        }
    }
}

修改后调整duration参数就能正常控制动画速度了,参数单位确实为秒,设置为50就代表动画会在50秒内完成,运行速度会非常慢。

方案2:使用animation修饰符绑定状态

你也可以给需要动画的视图添加.animation修饰符,绑定对应的状态变量,同样可以指定动画参数:

if show {
    CollapsibleView()
        .animation(.linear(duration: 50), value: show)
}

这种写法下不需要在action里包裹withAnimation,修改show状态时会自动应用指定的动画效果。


内容的提问来源于stack exchange,提问作者John Sorensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:36:02