AppDelegate中的presentViewController在iOS8中有延迟

时间:2014-09-15 16:19:44

标签: ios8 appdelegate presentviewcontroller

所以我在iOS7中有一个完整的工作解决方案,通过appDelegate的didFinishLaunching中的presentViewController显示一个LoginViewController。

基本上我正在做这样的事情:

UIViewController *backgroundViewController = ...
self.window.rootViewController = backgroundViewController;
[self.window makeKeyAndVisible];

[self.window.rootViewController presentViewController:loginViewController
                                             animated:NO ...]

在iOS8中,我看到了一个跳跃。首先,我看到backgroundViewController然后大约1秒钟左右登录出现。

那么,我如何防止iOS8中的这种跳跃?

我发现这a ton developers kind of problem {{3}},但仍未找到解决方案。

5 个答案:

答案 0 :(得分:17)

也是一个黑客(现在),但只有一行代码

在演示之前将您正在呈现的视图控制器的视图添加到窗口

UIViewController *viewController = [[UIViewController alloc] init];
[viewController.view setBackgroundColor:[UIColor greenColor]];

//  Temporary iOS8 fix for 'presentation lag' on launch
[self.window addSubview:viewController.view];

[self.window.rootViewController presentViewController:viewController animated:NO completion:nil];

如果您要呈现导航控制器而不是添加导航控制器的视图而不是其顶视图控制器。

答案 1 :(得分:2)

我有一个快速的解决方法:

//Make a screenshot of the ViewController first, or use a real image if you want

__block UIImageView *fakeImageView = [[UIImageView alloc] initWithImage:image];
fakeImageView.frame = vc.view.frame;
[self.view addSubview:fakeImageView];

[self presentViewController:vc animated:animated completion:^{
    [fakeImageView removeFromSuperview];
    fakeImageView = nil;
}];

长期来说不好,但可以在不改变太多代码的情况下快速解决此问题。

等待更好的解决方案。

答案 2 :(得分:1)

您可以将窗口设置为临时控制器的实例。

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];

从设置控制器(LoginViewController)中,您可以使用所需的转换推送您的真实登录控制器。登录序列结束后,您可以从登录控制器转换到默认的应用程序根视图控制器。

[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];

答案 3 :(得分:0)

我在iOS8中也遇到了同样的问题,我找到了这个解决方案:

ABCViewController *obj = [[ABCViewController alloc] initWithNibName:@"ABCViewController" bundle:nil];                        

CATransition *transition = [CATransition animation];
transition.duration = 0.4;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromBottom;
transition.delegate = self;
[self.navigationControler.view.layer addAnimation:transition forKey:nil];
[appDelegate.navigationControler obj animated:NO];
 obj = nil;

我希望这个解决方案可以帮到你!

答案 4 :(得分:-3)

这应该有效: 调用 [loginViewController视图] 在介绍之前。