在Swiftui的链接动画



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

假设我有一个观点,即首先需要扩展,然后等待几秒钟,然后淡出(然后等待几秒钟,然后重新开始 - 无限期地开始(。

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

到目前为止,我能想到的最好的是,在初始视图.onappear((修饰符和该功能中调用自定义函数,在动画的每个阶段都具有withamimation((块,它们之间的延迟。因此,它基本上看起来像这样:

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()
}

我发现这会比使用DispatchQueueTimer更加始终如一,这可能是因为它在所有动画中使用了相同的调度程序。

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

使用计时器工作。这来自我自己的项目:

@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.
}

我恐怕暂时不支持像关键帧这样的东西。至少他们可以添加onAnimationEnd() ...但是没有这样的东西。

我确实设法运气,正在为形状路径进行动画。尽管没有密钥帧,但您可以控制更多的控制权,因为您可以定义" Animatabledata"。例如,检查我对另一个问题的答案:https://stackoverflow.com/a/56885066/7786555

在这种情况下,它基本上是一种旋转的弧线,但是从零到一定的长度,在回合结束时,它逐渐返回到零长度。动画有3个阶段:起初,弧线的一端移动,而另一端则没有。然后,他们俩都以相同的速度一起移动,最后第二端到达了第一个。我的第一种方法是使用调度员的想法,它起作用了,但我同意:这非常丑陋。然后,我找出如何正确使用Animatabledata。所以...如果您正在动画道路,那您很幸运。否则,似乎我们必须等待更优雅的代码的可能性。

相关内容

  • 没有找到相关文章

最新更新