在 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 中动态更改动画的持续时间的主要内容,如果未能解决你的问题,请参考以下文章