UIView动画完成块未被调用

时间:2014-07-24 22:23:10

标签: ios ios7 uiview objective-c-blocks uiviewanimation

我有一个奇怪的错误,我在我正在处理的应用程序中找到了。在我进入细节之前,我将陈述我的问题

1 - 为什么不能调用UIView动画完成块

2 - 为什么在呈现模态视图后会调用UIView动画完成块?

我有一系列UIView动画,在视图控制器出现后开始。他们有完成块。绝大部分时间都会调用动画完成块。但是,应用程序经常会进入一个不会调用完成块的状​​态。

此外,当我从当前视图控制器以模态方式呈现新视图控制器时,在调用之前未调用的动画完成块。

一旦应用程序处于此状态,动画完成块永远不会再次被调用,除非我再次呈现模态视图。

我的动画块基本上是这样的:

 int i = 0;
 for (UIView *view in self.cellImageViews)
 {
     [UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION
                           delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL
                         options:UIViewAnimationOptionCurveEaseIn
                      animations:^{
                          view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION);
                      } completion:^(BOOL finished) {
                         NSLog(@"Animation Completed: i:%d, finished:%d, count%d",i,finished,[self.oldCellImageViews count])
                         if(finished && (i == ([self.cellImageViews count]-1)))
                         {
                            NSLog(@"if statement passed");
                            // My completion block stuff goes here
                         } 
                       }             
         ];
        i++;
    }

2 个答案:

答案 0 :(得分:1)

CALayer动画不是排队,而是复合。在当前的方法中,您正在安排一些动画在一个或多个先前的动画没有机会完成之前开始。

如果你绝对想要排队 CALayer动画,你还有其他选择,其中一些是:

  1. 在前一个(链接)的完成^块中触发新动画。
  2. 使用委托并在-animationDidStop:finished:
  3. 中触发新动画
  4. 你可能会在紧急情况下逃脱UIViewAnimationOptionBeginFromCurrentState
  5. 真正的解决方案是使用CALayer动画,但CAAnimation

答案 1 :(得分:1)

尝试以下

[UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION
                      delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                     int i = 0;

                     for (UIView *view in self.cellImageViews)
                     {
                         view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION);
                         i++;
                     }

                 } completion:^(BOOL finished) {
                     if(finished)
                     {
                         NSLog(@"if statement passed");
                         // My completion block stuff goes here
                     }
                 }
 ];