我有一个奇怪的错误,我在我正在处理的应用程序中找到了。在我进入细节之前,我将陈述我的问题
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++;
}
答案 0 :(得分:1)
CALayer
动画不是排队,而是复合。在当前的方法中,您正在安排一些动画在一个或多个先前的动画没有机会完成之前开始。
如果你绝对想要排队 CALayer
动画,你还有其他选择,其中一些是:
-animationDidStop:finished:
。UIViewAnimationOptionBeginFromCurrentState
。真正的解决方案是不使用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
}
}
];