iOS显示递归加载动画,直到完成初始化代码块,然后显示最后一个动画

时间:2015-07-28 12:49:36

标签: ios objective-c animation uiview loading

我想在进行初始化时显示加载动画。所以我想旋转我的(UIImageView*)_LogoImage,直到我的初始化完成。然后,在完成初始化之后,我想缩放我的_LogoImage。所以,所有这些都从viewDidAppear开始,我在这里调用beginLoading:method。

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self beginLoading];
}

在这里,我正在开始我的旋转动画。假设,我在接下来的两个代码行中做了一些初始化,我更改了它们以使线程休眠以使我的初始化代码具有类似的行为。然后我调用stopSpin:方法来制作下一个半圈并进行最后一次缩放动画。

-(void)beginLoading{
    [self startSpin];
    [self sleepAction:3.0f];
    [self sleepAction:1.0f];
    [self stopSpin];
}
-(void)sleepAction:(float)sleepTime{
    NSLog(@"SleepTime:[%f]",sleepTime);
    [NSThread sleepForTimeInterval:sleepTime];
}

这是我的旋转代码,我以递归方式调用,直到我的BOOL refreshAnimating等于YES。如果不是 - 运行最后一个缩放动画

-(void)startSpin{
    [UIView animateWithDuration:0.4
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{
                         _LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
                     }
                     completion:^(BOOL finished){

                         [UIView animateWithDuration:0.4
                                               delay:0
                                             options:UIViewAnimationOptionCurveLinear
                                          animations:^{

                                              _LogoImage.transform = CGAffineTransformMakeRotation(0);
                                          }
                                          completion:^(BOOL finished){

                                              if (refreshAnimating) {
                                                  [self startSpin];
                                              }else{
                                                  [self refreshFinished];
                                              }

                                          }];
                     }];
}
-(void)stopSpin{
    refreshAnimating = NO;
}
-(void)refreshFinished{
    [UIView animateWithDuration:0.4 animations:^{
        [_LogoImage setTransform:CGAffineTransformMakeScale(2, 2)];
    }];
}

问题是我的动画没有运行,直到最后一个初始化代码行完成。完成后 - 我只能看到最后一个动画。我试图在后台和主线程中执行一些代码,但我没有按照我想要的方式运行。 旋转动画应该在视图出现时开始,并继续直到我的初始化代码完成 - 然后我想看到我的最后一个缩放动画,这将表明我的初始化已完成。 请帮忙。

2 个答案:

答案 0 :(得分:0)

所有动画都在主线程上运行,如果你使用sleep,它会阻止你的动画(主线程)。相反,您可以使用像MBProgressHUD这样的库,请随时提出进一步的问题。

修改

-(void)startSpin{
        _LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
        [UIView animateWithDuration:0.4
         delay:0
         options:UIViewAnimationOptionCurveLinear
         animations:^{
               _LogoImage.transform =CGAffineTransformMakeRotation(0);              
         }
             completion:nil];
}           

你能试试吗?我认为这就是我们想要做的事情。

答案 1 :(得分:0)

正如@Ersin Sezgin所说,所有动画都在主线程上运行。 所以现在,我正在使用完成块处理程序在后台进行初始化,这会强制stopSpin:初始化完成后。 这是一些代码块。为了更好的可读性,有block的typedef。

typedef void(^OperationSuccessCompletionHandler)(BOOL success);
<。>文件中的

-(void)sleepAction:(OperationSuccessCompletionHandler)success{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // We are doing initialisation here
    BOOL isOperationSuccess = YES // Assume initialisation was successful
    success(isOperationSuccess);
 });
}

所以现在我们可以用另一种方式做到这一点

-(void)beginLoading{
    [self startSpin];
    [self sleepAction:^(BOOL success){
        [self sleepAction:^(BOOL success){
            [self stopSpin];
        }];
    }];
}