首页 > 解决方案 > 在 SwiftUI 中链接动画

问题描述

我正在 SwiftUI 中制作一个相对复杂的动画,并且想知道链接各个动画阶段的最佳/最优雅的方式是什么。

假设我有一个首先需要缩放的视图,然后等待几秒钟然后淡出(然后等待几秒钟并重新开始 - 无限期地)。

如果我尝试在同一个视图/堆栈上使用多个 withAnimation() 块,它们最终会相互干扰并弄乱动画。

到目前为止,我能想到的最好的方法是在初始视图 .onAppear() 修饰符上调用自定义函数,并在该函数中为动画的每个阶段设置 withAnimation() 块,并在它们之间设置延迟。所以,它基本上看起来像这样:

func doAnimations() {
  withAnimation(...)

  DispatchQueue.main.asyncAfter(...)
    withAnimation(...)

  DispatchQueue.main.asyncAfter(...)
    withAnimation(...)

  ...

}

它最终变得很长,而且不是很“漂亮”。我确信必须有更好/更好的方法来做到这一点,但到目前为止我尝试的一切都没有给我想要的确切流程。

任何想法/建议/提示将不胜感激。谢谢!

标签: animationswiftuixcode11ios13

解决方案


正如其他回复中提到的,目前 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()
}

我发现与使用DispatchQueueor相比,这会导致更一致地更平滑的链式动画Timer,可能是因为它对所有动画使用相同的调度程序。

处理所有延迟和持续时间可能很麻烦,因此雄心勃勃的开发人员可能会将计算抽象为某个全局withChainedAnimation函数,而不是为您处理。


推荐阅读