25

所以我在 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 中防止这种跳跃呢?

我看到有很多开发人员遇到这种问题,但仍然没有找到解决方案。

4

5 回答 5

17

也是一个 hack(目前),但只有一行代码

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

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

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

于 2014-10-11T04:53:36.650 回答
2

我有一个快速的hacky修复:

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

从长远来看,这并不好,但可以在不更改太多代码的情况下快速解决此问题。

等待更好的解决方案。

于 2014-10-09T16:06:29.753 回答
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];
于 2014-09-23T14:21:41.927 回答
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;

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

于 2014-09-23T13:34:28.287 回答
-3

这应该有效: 在呈现之前调用[loginViewController view] 。

于 2015-02-19T17:10:22.070 回答