我是SwiftUI
(以及整个iOS开发的新手)的新手。我了解到可以在SwiftUI
中为视图设置动画,可以做到:
MyView()
.scaleEffect(scaleValue)
.onAppear {
scaleValue = anotherValue
}
.animation(.spring())
但是我似乎无法弄清楚该动画结束时如何收听,因此我可以触发其他一些事情,例如运行其他动画或执行一些netwrok请求。
有人可以引导我吗?我可以附加一个回调,以便在动画结束时得到通知吗?
谢谢。
答案 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.5
或0.3
之类的东西?!
答案:SwiftUI动画的默认持续时间通常为0.25秒,因此,如果您以0.25 s的延迟应用第二个动画,它将在第一个动画之后立即发生。您当然可以根据需要更改该值(如果您不知道,还可以定义动画的持续时间,就像PS一样)。