首页 文章

UIView动画完成块未被调用

提问于
浏览
2

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

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 回答

  • 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
                         }
                     }
     ];
    
  • 1

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

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

    • 在前一个(链接)的完成^块中触发新动画 .

    • 使用委托并在 -animationDidStop:finished: 中触发新动画 .

    • 你可以捏一下 UIViewAnimationOptionBeginFromCurrentState .

    真正的解决方案是 not 使用 CALayer 动画,但 CAAnimation .

相关问题