Ios 在UIView动画中立即调用完成块
我试图一个接一个地更改子视图的颜色,但所有视图的颜色都会立即更改,即使我已将动画持续时间设置为2秒Ios 在UIView动画中立即调用完成块,ios,uiview,objective-c-blocks,uianimation,Ios,Uiview,Objective C Blocks,Uianimation,我试图一个接一个地更改子视图的颜色,但所有视图的颜色都会立即更改,即使我已将动画持续时间设置为2秒 - (void)runAnimation { NSMutableArray *views = [[NSMutableArray alloc]init]; for (UIView *bubble in self.subviews) { if(bubble.tag == 2500) [views addObject:bubble];
- (void)runAnimation
{
NSMutableArray *views = [[NSMutableArray alloc]init];
for (UIView *bubble in self.subviews)
{
if(bubble.tag == 2500)
[views addObject:bubble];
}
__weak PKCustomSlider *weak_self = self;
__block NSInteger currentView = 0;
self.animationBlock = ^{
[UIView animateWithDuration:2 animations:^{
NSLog(@"Animation block called again");
[views[currentView] setBackgroundColor:[UIColor colorWithRed:1 green:0 blue:0 alpha:1]];
} completion:^(BOOL finished) {
currentView += 1;
if(!finished)
{
NSLog(@"Animation hasn't finished");
return;
}
if (currentView == views.count){
currentView = 0;
NSLog(@"Animation block ended");
}
else
{
weak_self.animationBlock();
NSLog(@"Animation block called again because views still available in the array");
}
}];
self.animationBlock();
}
如果您试图为一个又一个视图设置动画,则不必依赖于完成块。如果动画块中没有要执行的动画,则可以立即调用完成块 您可以这样做:
- (void)runAnimation
{
for (int i = 0; i < self.subviews.count; i++) {
UIView *bubble = self.subviews[i];
if (bubble.tag != 2500)
continue;
[UIView animateWithDuration:2 delay:2*i options:0 animations:^{
[bubble setBackgroundColor:[UIColor colorWithRed:0 green:1 blue:0 alpha:1]];
} completion:nil];
}
}
-(无效)运行动画
{
对于(int i=0;i
您在日志中看到了什么?如果视图不是当前UIWindow
@ianmacdonald的子视图,我认为会立即执行完成块,但我的self.subviews会返回视图数组。它是窗口的子视图,因此只有self.subviews返回数组,对吗?这是解决问题的更好方法,+1