1

我是新手SwiftUI(以及整个 iOS 开发)。我了解到,要为视图设置动画,SwiftUI您可以执行以下操作:

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

但我似乎无法弄清楚当这个动画结束时我怎么能听,所以我可以触发一些其他的事情,比如运行不同的动画或做一些网络请求。

有人可以指导我吗?有没有我可以附加的回调,以便我可以在动画结束时收到通知?

提前致谢。

4

1 回答 1

0

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

假设您有一个变量@State var animatedVariable,当您想将动画应用到 UI 并随着您的动画变量的变化而变化时,您可以说withAnimation { animatedVariable = someNewValue }. 现在如果你想在第一个动画完成后做另一个动画,你应该先声明一个新变量:@State var delayedAnimatedVariable你可以在任何你想应用延迟动画的地方使用它。为了让它工作,你最好不要delayedAnimatedVariable直接设置值。相反,您应该使用延迟动画来监听 的变化animatedVariable并更改其值。delayedAnimatedVariable为此,您应该使用.onChange(available 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 秒的延迟应用第二个动画,它将在第一个动画之后立即发生。您当然可以根据需要更改该值(如果您不知道,您也可以定义动画的持续时间,就像 PS 一样)。

于 2020-08-23T17:47:27.533 回答