3

我有多个必须作为链运行的动画。我一直在处理这个问题的方法是使用 completionHandler 并运行下一个动画块。有没有更清洁的方法来处理这个问题?

[UIView animateWithDuration:1 animations^{

        // perform first animation
     }completion:(BOOL finished){

          [UIView animateWithDuration:1 animations^{

               // perform second animation
          }completion:(BOOL finished){

         }];

}];
4

2 回答 2

10

您也可以使用animateWithDuration:delay:options:animations:completion:交错延迟,以便它们按顺序开始,但通常最好使用完成块来完成。

如果有几个并且它使代码难以阅读,只需将这些块分解(我是在脑海中输入这个,所以它可能无法编译):

typedef void (^AnimationBlock)();

AnimationBlock firstAnimation = ^{ ... };
AnimationBlock secondAnimation = ^{ ... };

[UIView animateWithDuration:1 animations:firstAnimation completion:(BOOL finished) {
  [UIView animateWithDuration:1 animations:secondAnimation];}];

您可以在其上创建一个类别UIView,将这些块的数组并为您将它们链接在一起,但是您必须处理所有极端情况。你如何定义时间;您如何处理中止的动画等。在大多数情况下,上述方法可能是最好的方法。

于 2012-04-04T22:04:21.130 回答
1

我写了一篇关于这个的博客文章。我的方法是创建一个封装块和其他动画属性的动画对象。然后,您可以将这些对象的数组传递给另一个将按顺序执行它们的动画对象。代码可在GitHub上找到。

于 2013-05-21T19:36:53.863 回答