Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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完成动画制作后调用完成块来制作UIView数组的动画?_Ios_Objective C_Uiviewanimation - Fatal编程技术网

Ios 如何在所有UIView完成动画制作后调用完成块来制作UIView数组的动画?

Ios 如何在所有UIView完成动画制作后调用完成块来制作UIView数组的动画?,ios,objective-c,uiviewanimation,Ios,Objective C,Uiviewanimation,我正在为数组中的每个UIView设置动画,我想知道所有动画何时完成。例如:我用一个简单的缩放动画在ViewController上显示10个UIView,每个UIView都有一个小延迟。在所有10个动画完成后,我想在完成块中再做一个动画 如何知道所有动画何时完成?您可以尝试使用一组动画。每个UIView都使用一个动画。每个动画都会将animationDidStart:和animationDidStop:finished:发送到其代理。因此,您可以在所有动画完成后运行代码。请看动画组您可以尝试使用动

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


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

您可以尝试使用一组动画。每个UIView都使用一个动画。每个动画都会将animationDidStart:和animationDidStop:finished:发送到其代理。因此,您可以在所有动画完成后运行代码。请看动画组

您可以尝试使用动画组吗。每个UIView都使用一个动画。每个动画都会将animationDidStart:和animationDidStop:finished:发送到其代理。因此,您可以在所有动画完成后运行代码。请查看animationgroup

如果您的
UIView
s顺序延迟,您排队的最后一个将是最后一个完成的。在它的完成块中完成你的工作

或者,您可以执行以下操作:

__block int finishedViews = 0;
[UIView animateWithDuration:... completion:^(BOOL finished) {
  if (++finishedViews == numberOfViews) {
    // do stuff.
  }
}];

如果您的
ui视图
s按顺序延迟,则您排队的最后一个视图将是最后一个完成的视图。在它的完成块中完成你的工作

或者,您可以执行以下操作:

__block int finishedViews = 0;
[UIView animateWithDuration:... completion:^(BOOL finished) {
  if (++finishedViews == numberOfViews) {
    // do stuff.
  }
}];
试试这个:

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();
试试这个:

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

假设您在
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
}
编辑


变量
nbTerminated

需要
\u块
,假设您的
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
}
编辑


\uu block
是变量所需的
nbTerminated

每个视图都是相同的动画每个视图都是相同的动画感谢zbMax,其工作原理与下面Ian的解决方案类似。这里只有一个小错误,nbTerminated变量需要_块声明。感谢zbMax,它的工作原理与下面Ian的解决方案类似。这里只有一个小错误,nbTerminated变量需要_块声明。对不起,您的解决方案对我不起作用。只有一个视图设置了动画并处于循环中:-/在animateWithDuration中,您应该只设置一个视图的动画,这是在UIView*view=mutableViews.firstObject中获得的;对不起,你的解决方案对我不起作用。只有一个视图设置了动画并处于循环中:-/在animateWithDuration中,您应该只设置一个视图的动画,这是在UIView*view=mutableViews.firstObject中获得的;