Animation 在SwiftUI中链接动画

Animation 在SwiftUI中链接动画,animation,swiftui,xcode11,ios13,Animation,Swiftui,Xcode11,Ios13,我正在用SwiftUI制作一个相对复杂的动画,我想知道链接各个动画阶段的最佳/最优雅的方式是什么 假设我有一个视图,首先需要缩放,然后等待几秒钟,然后淡出(然后等待几秒钟,然后无限期地重新开始) 如果我尝试在同一个视图/堆栈上使用几个withAnimation()块,它们最终会相互干扰并弄乱动画 到目前为止,我能想到的最好方法是在初始视图上调用一个自定义函数。onAppear()修饰符,在该函数中,动画的每个阶段都有withAnimation()块,其间有延迟。所以,它基本上看起来是这样的: f

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

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

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

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

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())第一次完成后就开始了。但我放弃了这个想法,因为我不是很成功。但也许这是你可以探索的。是的,我也尝试了,但运气不太好…:[再次感谢大家,祝大家好运…:]