animation - 在 SwiftUI 中链接动画
问题描述
我正在 SwiftUI 中制作一个相对复杂的动画,并且想知道链接各个动画阶段的最佳/最优雅的方式是什么。
假设我有一个首先需要缩放的视图,然后等待几秒钟然后淡出(然后等待几秒钟并重新开始 - 无限期地)。
如果我尝试在同一个视图/堆栈上使用多个 withAnimation() 块,它们最终会相互干扰并弄乱动画。
到目前为止,我能想到的最好的方法是在初始视图 .onAppear() 修饰符上调用自定义函数,并在该函数中为动画的每个阶段设置 withAnimation() 块,并在它们之间设置延迟。所以,它基本上看起来像这样:
func doAnimations() {
withAnimation(...)
DispatchQueue.main.asyncAfter(...)
withAnimation(...)
DispatchQueue.main.asyncAfter(...)
withAnimation(...)
...
}
它最终变得很长,而且不是很“漂亮”。我确信必须有更好/更好的方法来做到这一点,但到目前为止我尝试的一切都没有给我想要的确切流程。
任何想法/建议/提示将不胜感激。谢谢!
解决方案
正如其他回复中提到的,目前 SwiftUI 中没有链接动画的机制,但您不一定需要使用手动计时器。相反,您可以delay
在链式动画上使用该函数:
withAnimation(Animation.easeIn(duration: 1.23)) {
self.doSomethingFirst()
}
withAnimation(Animation.easeOut(duration: 4.56).delay(1.23)) {
self.thenDoSomethingElse()
}
withAnimation(Animation.default.delay(1.23 + 4.56)) {
self.andThenDoAThirdThing()
}
我发现与使用DispatchQueue
or相比,这会导致更一致地更平滑的链式动画Timer
,可能是因为它对所有动画使用相同的调度程序。
处理所有延迟和持续时间可能很麻烦,因此雄心勃勃的开发人员可能会将计算抽象为某个全局withChainedAnimation
函数,而不是为您处理。
推荐阅读
- python - python多处理中传递大对象的方法
- react-native - 如何使用 expo sdk 36 中的通知导航到不同的屏幕
- python - 'DataFrame' 对象不可调用 PYTHON
- virtual-machine - 有没有办法在 IBM Cloud 中查看已停止的 VM 实例列表?
- css - 如何将此特定行的 div css 行转换为 django 模板行?
- javascript - 在 gatsby.js 中将 graphql 数据从父级传递给子级
- mysql - 使用mysql获取插入记录的列表
- javascript - 更新对象中所有发生的键的值
- c# - 迭代器变量在它来自的 IEnumerable 中不存在?
- javascript - 如何正确模拟 react-native-firebase v6