在 SwiftUI 中动态更改动画的持续时间

Posted

技术标签:

【中文标题】在 SwiftUI 中动态更改动画的持续时间【英文标题】:Changing animation's duration dynamically in SwiftUI 【发布时间】:2020-08-21 09:29:24 【问题描述】:

我正在尝试在动画时更改动画的持续时间。我有两个属性-isAnimating 确定动画是否应该运行,duration。有一个正在动画的视图,切换isAnimating 的按钮和绑定到持续时间状态的滑块。当动画正在播放并且我使用 Slider 更改值时,持续时间不会改变。有什么方法可以实现我想要的吗?

struct ContentView: View 
    @State var isAnimating = false
    @State var duration = 2.0
    
    var body: some View 
        VStack 
            Spacer()
            Circle()
                .frame(width: 50.0, height: 50.0)
                .scaleEffect(isAnimating ? 2.0 : 1.0)
                .animation(
                    isAnimating ?
                        Animation.easeOut(duration: duration).repeatForever(autoreverses: false) :
                        .default
            )
            
            Spacer()
            
            Button(
                action:  self.isAnimating.toggle() ,
                label:  Text("Tap") 
            )
            
            Spacer()
            
            Slider(value: $duration, in: (0.1 ... 5.0))
                .padding([.horizontal], 20.0)
                .padding([.bottom], 50.0)
        
    

我也尝试了不同的方法,但总是有一些问题(例如动画视图闪烁)。

【问题讨论】:

【参考方案1】:

如果您在动画中添加 .repeatForever() 修饰符,则动画将永远运行,顾名思义(使用给定参数)。唯一的可能是停止动画并“重新运行”一个更改了“持续时间”值的新动画。

【讨论】:

那么...如何停止并重新运行具有不同属性的新动画?

以上是关于在 SwiftUI 中动态更改动画的持续时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 应用生命周期中更改状态栏样式?

如何在 SwiftUI 中动画/过渡文本值更改

如何在 SwiftUI 中禁用子视图上的特定状态更改动画

SwiftUI:如何使用延迟在两个图像之间设置动画过渡?

动画不适用于 SwiftUI 视图状态更改

来自 @Published 属性的 SwiftUI 动画从视图外部更改