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