我为数组中的每个UIView制作动画,并想知道所有动画何时完成。例如:我在ViewController上使用简单的缩放动画显示10个UIViews,并为每个UIView显示一个小延迟。完成所有10个动画后,我想在完成块中再做一个动画。
我如何知道所有动画何时完成?
答案 0 :(得分:4)
如果您的UIView
按顺序延迟,则排队的最后一个将是最后一个完成的。只需在完成块中完成你的工作。
或者,您可以执行以下操作:
__block int finishedViews = 0;
[UIView animateWithDuration:... completion:^(BOOL finished) {
if (++finishedViews == numberOfViews) {
// do stuff.
}
}];
答案 1 :(得分:2)
假设您的UIViewController
属性NSArray *arrayOfViews
中包含您要设置动画的视图。你想要的可能是这样的:
-(void)animateTheViews
{
__block int nbTerminated = 0;
for(UIView *aView in arrayOfViews)
{
[UIView animateWithDuration:/*duration time in seconds*/
animations:^{
//set here the changes for aView
} completion:^(BOOL finished) {
nbTerminated++;
if(nbTerminated==[arrayOfViews count])
{
[self whatToDoWhenFinished];
}
}];
}
}
-(void)whatToDoWhenFinished
{
//some stuff
}
修改强>
变量__block
需要 nbTerminated
答案 2 :(得分:0)
你可以尝试使用动画组。每个UIView都在使用动画。每个动画都将animationDidStart:和animationDidStop:finished:发送给它的委托。因此,您可以在每个动画完成后运行代码。请看一下animationgroup enter link description here
答案 3 :(得分:0)
试试这个:
typedef void (^VoidBlock)(void);
typedef void (^BoolBlock)(BOOL flag);
:
@property (nonatomic, strong)VoidBlock animationBlock;
和动画:
NSArray *views = @[];
NSMutableArray *mutableViews = [views mutableCopy];
BoolBlock completionBlock = ^(BOOL flag){
[mutableViews removeObjectAtIndex:0];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{//delay
self.animationBlock();
});
};
self.animationBlock = ^{
UIView *view = mutableViews.firstObject;
[UIView animateWithDuration:0.25 animations:^{
//animate view
}completion:completionBlock];
};
self.animationBlock();