功能链快速延迟

时间:2015-08-10 13:33:05

标签: ios swift functional-programming queue chain

我想知道如何链接一系列UIView.animationWithDuration:completion:函数来执行前一个animationWithDuration完成关闭时的每个下一个函数。所以我应该有类似的东西:

finalAnimation <<< animationB <<< animationA <<< initialValues()

如果函数内部没有任何时间延迟,很容易链接它们。此外,使用包含队列项的共享对象构建动画队列也很容易。但目前尚不清楚如何构建这样的队列而不共享任何东西,只需链接animationWithDuration:completion: 谢谢你的建议

4 个答案:

答案 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)

我遇到了这个可能对您有趣的图书馆。它的文档中有一节关于链接动画。

https://github.com/MengTo/Spring

答案 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秒的固定延迟。如果您想要可变延迟,则需要创建一个延迟值数组。