【问题标题】:presentViewController in AppDelegate with delay in iOS8AppDelegate 中的 presentViewController 在 iOS8 中有延迟
【发布时间】:2014-11-09 05:47:21
【问题描述】:

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

我看到这是developers 中的a ton 和这个kind of problem,但仍然没有找到解决方案。

【问题讨论】:

  • 您找到解决方案了吗?我在 iPhone 5S 上的 iOS 8 上看到了同样的问题。但 Xcode 6 模拟器在 iPhone 6/6+ 模拟器上显示正常动画。
  • 也在寻找解决方案
  • 模拟器也有这个问题,但是你看的不是那么清楚,因为它更快。我找到的唯一解决方案是通过容器视图控制器自己创建该动画。但是,我的解决方案与 tabviewcontrollers 有一些问题:/(当我们更改 viewcontrollers 时不会调用 viewDidAppear)
  • 我有同样的问题,经过一番调查,我发现,在我的情况下,最好的解决方案不是呈现 loginViewController,而是设置 self.window.rootViewController = loginViewController。当我需要关闭 loginViewController 时,我正在设置 self.window.rootViewController = backgroundViewController。我不喜欢这个解决方案,但它确实有效。
  • @somedev 我最终选择了这条路线,添加了一个通知 loginWillComplete 我切换了 rootViewController,然后继续我的登录过程。像魅力一样工作。

标签: ios8 appdelegate presentviewcontroller


【解决方案1】:

也是一个 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];

如果您展示的是导航控制器,请添加导航控制器的视图而不是其顶部视图控制器。

【讨论】:

  • 有效。但是状态栏有点时髦。
  • @markturnip 是关于颜色的吗?我注意到如果两个视图控制器之间的状态栏颜色相同,这效果最好,您是否在状态栏上遇到其他奇怪的行为?
  • 这可行,但正如@markturnip 所提到的,状态栏会改变颜色=/
【解决方案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;
}];

长期来看不好,但是不用改太多代码就可以快速解决这个问题。

等待更好的解决方案。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-07
          • 1970-01-01
          • 1970-01-01
          • 2012-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多