我想知道如何链接一系列UIView.animationWithDuration:completion:
函数来执行前一个animationWithDuration完成关闭时的每个下一个函数。所以我应该有类似的东西:
finalAnimation <<< animationB <<< animationA <<< initialValues()
如果函数内部没有任何时间延迟,很容易链接它们。此外,使用包含队列项的共享对象构建动画队列也很容易。但目前尚不清楚如何构建这样的队列而不共享任何东西,只需链接animationWithDuration:completion:
谢谢你的建议
答案 0 :(得分:1)
您无法使用动画链接,链接要求函数返回可选类型fun1()?.func2()?.func3()
。这是无法实现的,因为animateWithDuraion:立即返回。您可以使用dispatch_semaphore等待完成块,但不推荐使用它,因为您的动画不应该阻止主线程
这是我的建议:
你可以做这样的事情
func myAnimation(duration: NSTimeInterval, animation:() -> Void, onFinish: () -> Void) {
UIView.animateWithDuration(duration, animations: { () -> Void in
animation()
}) { (finished: Bool) -> Void in
onFinish()
}
}
然后
myAnimation(0.0, { animation in
}) { completion in
myAnimation(0.0, { animation in
}, { completion in
myAnimation(0.0, { animation in
}, { completion in
})
})
}
答案 1 :(得分:1)
我遇到了这个可能对您有趣的图书馆。它的文档中有一节关于链接动画。
答案 2 :(得分:1)
DON&#39; T巢动画。你想要的是animateKeyframesWithDuration(_:delay:options:animations:completion:),它允许你以更清洁的方式将动画链接在一起。
另见http://commandshift.co.uk/blog/2014/04/01/stop-nesting-animation-blocks/
答案 3 :(得分:1)
我同意@NRitH关键帧动画是一个很好的方法。
另一个选择是编写一个从完成处理程序调用自身的方法。像这样:
var step = 3;
func animate()
{
UIView.animateWithDuration: 1.0,
delay: 1.0,
options: 0,
animations: ^
{
switch step:
{
case 3:
//1st animation
case 2:
//2nd animation
case 1:
//3rd animation
default:
//we're done
}
},
completion: ^
{
(finished) in
step--
if finished && step > 0
{
animate()
}
}
}
(语法可能不完美。过去一个月左右我一直在Objective-C工作,所以我的Swift生锈了。)
我刚刚意识到你想在动画之间添加延迟。我编辑了我的代码以说明如何做到这一点。
我在步骤之间放置了1秒的固定延迟。如果您想要可变延迟,则需要创建一个延迟值数组。