AppDelegate中的presentViewController在iOS8中延迟

AppDelegate中的presentViewController在iOS8中延迟,ios8,appdelegate,presentviewcontroller,Ios8,Appdelegate,Presentviewcontroller,因此,我在iOS7中有一个完整的工作解决方案,它通过AppDelegate的didFinishLaunching中的presentViewController显示LoginViewController 基本上我是这样做的: UIViewController *backgroundViewController = ... self.window.rootViewController = backgroundViewController; [self.window makeKeyAndVisible

因此,我在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中的这种跳跃呢


我看到有人对此表示不满,但仍然没有找到解决方案。

我在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;

我希望这个解决方案能帮助你

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

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];
[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];
从set controller(LoginViewController)中,您可以使用所需的转换推送真正的登录控制器。登录序列结束后,您可以从登录控制器转换到默认的应用程序根视图控制器

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];
[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];

我有一个简单的解决方法:

//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;
}];
这对长期来说并不好,但可以在不更改太多代码的情况下快速修复此问题

等待更好的解决方案。

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

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

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];
如果要显示导航控制器,请添加导航控制器的视图,而不是其俯视图控制器。

这应该可以:
self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];
[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];
调用[loginViewController视图]
演示前。

您找到解决方案了吗?我在iphone5s上看到了ios8的同样问题。但是Xcode 6模拟器在iPhone 6/6+模拟器上显示正常的动画。也在寻找解决方案模拟器也有这个问题,但是你看不清楚,因为它速度更快。我找到的唯一解决方案是通过容器视图控制器自己创建动画。但是,我的解决方案在选项卡viewcontrollers上有一些问题:/(当我们更改viewcontrollers时不会调用viewDidAppear)我也有同样的问题,经过一些调查,我发现,在我的情况下,最好的解决方案不是显示loginViewController,而是设置self.window.rootViewController=loginViewController。当我需要关闭loginViewController时,我设置self.window.rootViewController=backgroundViewController。我不喜欢这个解决方案,但它是有效的。@somedev我最终选择了这条路线,在切换rootViewController的地方添加了一个通知loginWillComplete,然后继续我的登录过程。很有魅力。但是状态栏有点时髦。@markturnip是关于颜色的吗?我注意到,如果两个视图控制器之间的状态栏颜色相同,则效果最佳。状态栏是否会出现其他奇怪的行为?这是可行的,但正如@markturnip所述,状态栏会改变颜色=/