SwiftUI:如何在第一个动画完成后运行另一个动画?

时间:2020-08-23 16:40:18

标签: swift swiftui swiftui-animation

我是SwiftUI(以及整个iOS开发的新手)的新手。我了解到可以在SwiftUI中为视图设置动画,可以做到:

MyView()
    .scaleEffect(scaleValue)
    .onAppear {
        scaleValue = anotherValue
    }
    .animation(.spring())

但是我似乎无法弄清楚该动画结束时如何收听,因此我可以触发其他一些事情,例如运行其他动画或执行一些netwrok请求。

有人可以引导我吗?我可以附加一个回调,以便在动画结束时得到通知吗?

谢谢。

1 个答案:

答案 0 :(得分:-1)

据我所知,还没有直接的方法来制作一系列动画。这比实际的解决方案更像是一种解决方法,但是它可以工作,并且不太复杂。

假设您有一个变量@State var animatedVariable,当您希望将动画应用于随animationVariable的更改而变化的UI时,您可以说withAnimation { animatedVariable = someNewValue }。 现在,如果您想在第一个动画完成后再制作另一个动画,则应该首先声明一个新变量:@State var delayedAnimatedVariable,然后可以在要应用该延迟动画的任何地方使用它。要使其正常工作,最好不要直接设置delayedAnimatedVariable的值。相反,您应该收听animatedVariable的更改,并使用延迟的动画更改delayedAnimatedVariable的值。为此,您应该使用.onChange(可用的Xcode 12+)修饰符:

.onChange(of: animatedVariable) { newValueOfAnimatedVariable in
    withAnimation(Animation.default.delay(0.25)) {
        delayedAnimatedVariable = newValueOfAnimatedVariable
    }
}

示例:

struct AnimatedView: View {
    
    @State var animatedVariable = ""
    @State var delayedAnimatedVariable = ""
    
    var body: View {
        VStack {
            Button("Animated with delay!") {
                withAnimation {
                    animatedVariable = "someNewValue"
                }
            }
            
            // everything that uses `delayedAnimatedVariable` will have a delayed animation
            // Note there is nothing to be animated in this example!
            
        }
        .onChange(of: animatedVariable) { newValue in
            withAnimation(Animation.default.delay(0.25)) {
                delayedAnimatedVariable = newValue
            }
        }
    }
    
}

问题:为什么在withAnimation(Animation.default.delay(0.25))中使用0.25而不是0.50.3之类的东西?!

答案:SwiftUI动画的默认持续时间通常为0.25秒,因此,如果您以0.25 s的延迟应用第二个动画,它将在第一个动画之后立即发生。您当然可以根据需要更改该值(如果您不知道,还可以定义动画的持续时间,就像PS一样)。