web-dev-qa-db-fra.com

presentViewController dans AppDelegate avec retard dans iOS8

J'avais donc une solution de travail complète dans iOS7 qui affiche un LoginViewController via presentViewController dans le didFinishLaunching de l'AppDelegate.

Fondamentalement, je fais quelque chose comme ça:

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

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

Dans iOS8, je vois un saut. D'abord, je vois le backgroundViewController puis après environ 1 seconde environ, la connexion apparaît.

Alors, comment puis-je empêcher ce saut dans iOS8?

Je vois qu'il y a ne tonne de développeurs avec ce genre de problème mais je n'ai toujours pas trouvé de solution.

25
Tiago Almeida

Également un hack (pour l'instant), mais juste une ligne de code

Ajoutez la vue du contrôleur de vue que vous présentez à la fenêtre avant la présentation

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

Si vous présentez un contrôleur de navigation, ajoutez la vue du contrôleur de navigation au lieu de son contrôleur de vue de dessus.

17
SomeGuy

J'ai une solution rapide:

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

Ce n'est pas bon à long terme, mais peut résoudre rapidement ce problème sans changer trop de code.

En attente de meilleures solutions.

2
Meng Zhang

Vous pouvez définir la fenêtre sur une instance d'un contrôleur temporaire.

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];

À partir du contrôleur défini (LoginViewController), vous pouvez pousser votre véritable contrôleur de connexion avec la transition souhaitée. Une fois la séquence de connexion terminée, vous pouvez effectuer une transition du contrôleur de connexion au contrôleur de vue racine de l'application par défaut.

[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];
1
Slav

J'ai également rencontré le même problème dans iOS8 et j'ai trouvé cette solution:

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;

J'espère que cette solution pourra vous aider!

0
sachin khard