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
相关产品推荐
相关产品推荐

