Ios 同步执行多个动画的最佳方式
这将是一个“最好的方式做”的问题 我知道有多种方法可以制作序列动画,但哪种方法更好呢 假设我有3个动画,一个接一个地执行,所以下一个动画只有在前一个动画完成后才开始 我可以用Ios 同步执行多个动画的最佳方式,ios,animation,swift3,uiviewanimation,Ios,Animation,Swift3,Uiviewanimation,这将是一个“最好的方式做”的问题 我知道有多种方法可以制作序列动画,但哪种方法更好呢 假设我有3个动画,一个接一个地执行,所以下一个动画只有在前一个动画完成后才开始 我可以用UIView.animate(withCompletionBlock:)来做,所以在完成部分我调用第二个,在第二个的completionBlock上我调用第三个 这一点特别让我想:这是一种“美丽”的方式吗?在另一个系统中使用completionBlocks是否存在任何已知问题 只是一个想法。在前面的动画完成块中调用动画,可能
UIView.animate(withCompletionBlock:)
来做,所以在完成部分我调用第二个,在第二个的completionBlock上我调用第三个
这一点特别让我想:这是一种“美丽”的方式吗?在另一个系统中使用completionBlocks是否存在任何已知问题
只是一个想法。在前面的动画完成块中调用动画,可能会带来类似于末日金字塔的代码,如果有10个同步动画,你不觉得吗
另一种方法是使用dispatch_after,我根据上一个动画的NSTimeInterval
调用下一个动画。在这种情况下,它可能会导致应用程序崩溃,暂停主线程以执行下一个线程,然后再次暂停它以执行第三个线程
我知道的最后一种方法是,我可以使用NSTimeInterval调用下一个动画,但这一种有点像dispatch_after选项
你认为哪种方式最好?
同步执行3个或3个以上的视觉动画(等待前一个动画完成以启动下一个动画)
我可能会在我的应用程序中经常使用它,我想用最好的方式开始它
示例
completionBlocks中的动画
DispatchQueue.main.async {
UIView.animate(withDuration: 2.0, animations: {
view1.alpha = 1
}, completion: { (_) in
UIView.animate(withDuration: 5.0, animations: {
view2.alpha = 1
}, completion: { (_) in
UIView.animate(withDuration: 2.0, animations: {
view3.alpha = 0
}, completion: { (_) in
UIView.animate(withDuration: 2.0, animations: {
view4.alpha = 0
}, completion: { (_) in
print("all completed")
})
})
})
})
}
在以下情况下发送给您:
let anim1_duration = 2.0
let anim2_duration = 3.0
let anim3_duraiton = 5.0
UIView.animate(withDuration: anim1_duration, animations: {
view1.alpha = 1
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.init(uptimeNanoseconds: UInt64(anim1_duration * Double(NSEC_PER_SEC)))) {
UIView.animate(withDuration: anim2_duration, animations: {
view2.alpha = 1
}
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.init(uptimeNanoseconds: UInt64((anim1_duration + anim2_duration) * Double(NSEC_PER_SEC)))) {
UIView.animate(withDuration: anim3_duration, animations: {
view3.alpha = 1
}
}
在“更好的阅读代码”方面考虑这2种动画表演方式:
UIView.animateKeyframes(withDuration: 20,
delay: 0,
options: [],
animations: {
UIView.addKeyframe(withRelativeStartTime: 0,
relativeDuration: 0.2,
animations: {
view1.alpha = 1
})
UIView.addKeyframe(withRelativeStartTime: 0.2,
relativeDuration: 0.3,
animations: {
view2.alpha = 1
})
UIView.addKeyframe(withRelativeStartTime: 0.5,
relativeDuration: 0.1,
animations: {
view3.alpha = 0
})
UIView.addKeyframe(withRelativeStartTime: 0.6,
relativeDuration: 0.4,
animations: {
view4.alpha = 0
})
},
completion: nil)
第二条路看起来更干净。我想知道这是最好的方法还是有更好的方法前一个动画结束时CAKeyFrameAnimation会开始吗?@IvanCantarino不会,但你可以按它的方式设置:)基本上所有动画都会同时运行,但你需要设置,以便第二个动画在第一个动画运行时是静态的。这肯定是什么我在找。谢谢
UIView.animateKeyframes(withDuration: 20,
delay: 0,
options: [],
animations: {
UIView.addKeyframe(withRelativeStartTime: 0,
relativeDuration: 0.2,
animations: {
view1.alpha = 1
})
UIView.addKeyframe(withRelativeStartTime: 0.2,
relativeDuration: 0.3,
animations: {
view2.alpha = 1
})
UIView.addKeyframe(withRelativeStartTime: 0.5,
relativeDuration: 0.1,
animations: {
view3.alpha = 0
})
UIView.addKeyframe(withRelativeStartTime: 0.6,
relativeDuration: 0.4,
animations: {
view4.alpha = 0
})
},
completion: nil)