在所有UIViews完成动画制作后,如何使用完成块调用UIViews数组的动画效果?

时间:2014-11-04 15:10:51

标签: ios objective-c uiviewanimation

我为数组中的每个UIView制作动画,并想知道所有动画何时完成。例如:我在ViewController上使用简单的缩放动画显示10个UIViews,并为每个UIView显示一个小延迟。完成所有10个动画后,我想在完成块中再做一个动画。

我如何知道所有动画何时完成?

4 个答案:

答案 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();