web-dev-qa-db-ja.com

iOS8で遅延が発生するAppDelegateのpresentViewController

したがって、AppDelegateのdidFinishLaunchingのpresentViewControllerを介してLoginViewControllerを表示する、完全に機能するソリューションをiOS7で実現しました。

基本的に私はこのようなことをしています:

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

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

IOS8ではジャンプが見られます。最初にbackgroundViewControllerが表示され、約1秒後にログインが表示されます。

では、iOS8でこのジャンプを防ぐにはどうすればよいですか?

a tondevelopers であることがわかります 問題の種類 でも解決策は見つかりませんでした。

25
Tiago Almeida

ハック(今のところ)も1行のコード

提示する前に、提示しているビューコントローラーのビューをウィンドウに追加する

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

ナビゲーションコントローラーを表示する場合は、トップビューコントローラーではなく、ナビゲーションコントローラーのビューを追加します。

17
SomeGuy

私は迅速なハック修正を持っています:

//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
Meng Zhang

ウィンドウを一時的なコントローラーのインスタンスに設定できます。

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

私は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;

このソリューションがお役に立てば幸いです。

0
sachin khard