Animation 在SwiftUI中链接动画
我正在用SwiftUI制作一个相对复杂的动画,我想知道链接各个动画阶段的最佳/最优雅的方式是什么 假设我有一个视图,首先需要缩放,然后等待几秒钟,然后淡出(然后等待几秒钟,然后无限期地重新开始) 如果我尝试在同一个视图/堆栈上使用几个withAnimation()块,它们最终会相互干扰并弄乱动画 到目前为止,我能想到的最好方法是在初始视图上调用一个自定义函数。onAppear()修饰符,在该函数中,动画的每个阶段都有withAnimation()块,其间有延迟。所以,它基本上看起来是这样的:Animation 在SwiftUI中链接动画,animation,swiftui,xcode11,ios13,Animation,Swiftui,Xcode11,Ios13,我正在用SwiftUI制作一个相对复杂的动画,我想知道链接各个动画阶段的最佳/最优雅的方式是什么 假设我有一个视图,首先需要缩放,然后等待几秒钟,然后淡出(然后等待几秒钟,然后无限期地重新开始) 如果我尝试在同一个视图/堆栈上使用几个withAnimation()块,它们最终会相互干扰并弄乱动画 到目前为止,我能想到的最好方法是在初始视图上调用一个自定义函数。onAppear()修饰符,在该函数中,动画的每个阶段都有withAnimation()块,其间有延迟。所以,它基本上看起来是这样的: f
func doAnimations() {
withAnimation(...)
DispatchQueue.main.asyncAfter(...)
withAnimation(...)
DispatchQueue.main.asyncAfter(...)
withAnimation(...)
...
}
结果是相当长,不太“漂亮”。我确信一定有更好/更好的方法来做到这一点,但迄今为止我所尝试的一切都没有给我想要的确切流程
如有任何想法/建议/提示,将不胜感激。谢谢 恐怕目前还不支持关键帧之类的东西。至少他们可以在AnimationEnd()上添加一个
,
。。。但是没有这样的事情
我的幸运之处在于为形状路径设置动画。虽然没有关键帧,但您可以定义“AnimatableData”,因此可以进行更多的控制。例如,检查我对不同问题的回答:
在这种情况下,它基本上是一个旋转的弧,但从零增长到某个长度,在转弯结束时,它逐渐回到零长度。动画有3个阶段:首先,圆弧的一端移动,但另一端不移动。然后它们以相同的速度一起移动,最后第二个端点到达第一个端点。我的第一个方法是使用DispatchQueue的思想,它很有效,但我同意:它非常丑陋。然后我想知道如何正确使用AnimatableData。所以如果您正在设置路径动画,那么您很幸运。否则,我们将不得不等待更优雅的代码出现。使用计时器是可行的。这来自我自己的项目:
@State private var isShowing = true
@State private var timer: Timer?
...
func askQuestion() {
withAnimation(Animation.easeInOut(duration: 1).delay(0.5)) {
isShowing.toggle()
}
timer = Timer.scheduledTimer(withTimeInterval: 1.6, repeats: false) { _ in
withAnimation(.easeInOut(duration: 1)) {
self.isShowing.toggle()
}
self.timer?.invalidate()
}
// code here executes before the timer is triggered.
}
如其他响应中所述,目前在SwiftUI中没有链接动画的机制,但您不一定需要使用手动计时器。相反,您可以对链接动画使用
delay
功能:
withAnimation(Animation.easeIn(持续时间:1.23)){
self.doSomethingFirst()
}
带动画(动画。播放(持续时间:4.56)。延迟(1.23)){
self.thenDoSomethingElse()
}
withAnimation(Animation.default.delay(1.23+4.56)){
自我和自我
}
我发现,与使用调度队列
或计时器
相比,这会产生更一致的平滑链式动画,可能是因为它对所有动画使用相同的调度程序
处理所有延迟和持续时间可能是一件麻烦事,因此雄心勃勃的开发人员可能会将计算抽象为一些全局
,并使用ChainedAnimation
函数,然后为您处理它。感谢您的快速响应。让我问你这个问题-如果你需要从另一个问题中提取动画,请在动画完成一整圈后停止动画,然后淡出并返回,然后重新启动动画。你能想出一种不添加DispatchQueue的方法吗?从我的头脑中,我想不出一种方法:-(我尝试过同时设置两个动画,其中一个是动画().delay())第一次完成后就开始了。但我放弃了这个想法,因为我不是很成功。但也许这是你可以探索的。是的,我也尝试了,但运气不太好…:[再次感谢大家,祝大家好运…:]