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

iOS show recursive loading animation until completion of initialisation code block, then show the last animation

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

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

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

主线程上的所有动画 运行,如果您使用睡眠,它会阻塞您的动画(主线程)。相反,您可以使用如下库:MBProgressHUD 请随时提出更多问题。

编辑

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

你能试试这个吗?我认为这就是我们正在努力做的。

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

typedef void(^OperationSuccessCompletionHandler)(BOOL success);

在 .m 文件中

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