したがって、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 であることがわかります 問題の種類 でも解決策は見つかりませんでした。
ハック(今のところ)も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];
ナビゲーションコントローラーを表示する場合は、トップビューコントローラーではなく、ナビゲーションコントローラーのビューを追加します。
私は迅速なハック修正を持っています:
//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;
}];
長期的には不向きですが、コードをあまり変更しなくてもこの問題をすばやく解決できます。
より良い解決策を待っています。
ウィンドウを一時的なコントローラーのインスタンスに設定できます。
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];
私は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;
このソリューションがお役に立てば幸いです。