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

mik*_*098 5 animation ios swift watchos swiftui

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

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 0

如果您向动画添加 .repeatForever() 修饰符,动画将如其名称所暗示的那样永远运行(使用给定的参数)。唯一的可能性是停止动画并“重新运行”具有更改的“持续时间”值的新动画。

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