据我所知,目前还没有一种直接的方法来制作一系列动画。这更像是一种解决方法,而不是实际的解决方案,但它有效,而且不太复杂。
假设您有一个变量@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.5
或 0.3
其他东西?!
答:SwiftUI 动画通常默认为 0.25 秒的持续时间,因此如果您以 0.25 秒的延迟应用第二个动画,它将在第一个动画之后立即发生。您当然可以根据需要更改该值(如果您不知道,您也可以定义动画的持续时间,就像 PS 一样)。