代码似乎按照我想要的顺序播放

时间:2015-06-07 01:01:20

标签: objective-c

- (void)viewDidLoad {
    [super viewDidLoad];
    [self pingSplash];
    UIViewController *next = [[self storyboard] instantiateViewControllerWithIdentifier:@"ViewController"];
    [self.navigationController pushViewController:next animated:YES];
}

我的意思是完成pinSplash然后pushViewController,但它直接转到ViewController页面,即使没有完成pingSplash,有什么好办法做这种工作?

对于pingSplash部分:

- (void) pingSplash
{
    SKSplashIcon *pingSplashIcon = [[SKSplashIcon alloc] initWithImage:[UIImage imageNamed:@"ping.png"] animationType:SKIconAnimationTypePing];
    _splashView = [[SKSplashView alloc] initWithSplashIcon:pingSplashIcon backgroundColor:[UIColor grayColor] animationType:SKSplashAnimationTypeBounce];
    _splashView.animationDuration = 5.0f;
    [self.view addSubview:_splashView];
    [_splashView startAnimation];
}

1 个答案:

答案 0 :(得分:0)

pingSplash方法在启动动画时立即返回,这就是为什么你最终过早推动视图控制器的原因。

有几种方法可以解决这个问题。一种方法是将块传递给在适当延迟后运行的pingSplash方法。

这是一种方式:

更新pingSplash方法以获取在5秒延迟后运行的完成处理程序块。

- (void) pingSplash:(void (^)(void))completion
{
    SKSplashIcon *pingSplashIcon = [[SKSplashIcon alloc] initWithImage:[UIImage imageNamed:@"ping.png"] animationType:SKIconAnimationTypePing];
    _splashView = [[SKSplashView alloc] initWithSplashIcon:pingSplashIcon backgroundColor:[UIColor grayColor] animationType:SKSplashAnimationTypeBounce];
    _splashView.animationDuration = 5.0f;
    [self.view addSubview:_splashView];
    [_splashView startAnimation];
    if (completion) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_splashView.animationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            completion();
        });
    }
}

然后更新您的viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    [self pingSplash:^{
        UIViewController *next = [[self storyboard] instantiateViewControllerWithIdentifier:@"ViewController"];
        [self.navigationController pushViewController:next animated:YES];
    }];
}