Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未调用UIView动画完成块_Ios_Ios7_Uiview_Objective C Blocks_Uiviewanimation - Fatal编程技术网

Ios 未调用UIView动画完成块

Ios 未调用UIView动画完成块,ios,ios7,uiview,objective-c-blocks,uiviewanimation,Ios,Ios7,Uiview,Objective C Blocks,Uiviewanimation,我在正在开发的应用程序中发现了一个奇怪的bug。在我进入细节之前,我将陈述我的问题 1-为什么不能调用UIView动画完成块 2-为什么在显示模式视图后会调用UIView动画完成块 我有一系列在视图控制器出现后开始的UIView动画。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用 此外,当我从当前视图控制器以模态方式呈现一个新的视图控制器时,在调用所有视图控制器之前未调用的动画完成块 一旦应用程序处于此状态,动画完成块将不再被调用,

我在正在开发的应用程序中发现了一个奇怪的bug。在我进入细节之前,我将陈述我的问题

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++;
    }

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

如果您绝对想排队观看
CALayer
动画,您还有其他选项,其中一些选项是:

  • 在前一个动画(链接)的completion^块中触发新动画
  • 使用代理并在
    -animationDidStop:finished:
    中触发新动画
  • 必要时,您可以使用
    uiviewmanimationoptionBeginFromCurrentState
  • 真正的解决方案是不要使用
    CALayer
    动画,而是
    CAAnimation

    尝试以下操作

    [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
                         }
                     }
     ];
    

    我不确定我是否理解你的答案。是的,动画以交错方式开始,是的,第二个动画在第一个动画完成之前开始,依此类推,这是我想要的行为。为什么这会阻止完成块被调用(为什么只是偶尔调用)?参见@NJGadhiya的评论。这里的关键字是
    CALayer
    vs.
    CAAnimation
    。通过在同一对象上调度另一个
    CALayer
    转换,您正在中断给定对象上的
    CALayer
    转换。如果您不想使用我概述的任何方法,也不想切换到
    CAAnimation
    ,您可以通过将
    uiviewmanimationoptionbeginformcurrentstate
    添加到您的选项中来逃脱。然后所有单元格将同时动画,而不是顺序启动。然后您必须使用
    CAAnimation