Ios 在UIView动画中立即调用完成块

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];

我试图一个接一个地更改子视图的颜色,但所有视图的颜色都会立即更改,即使我已将动画持续时间设置为2秒

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