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