La permutation rootViewController avec animation
Je vais avoir un peu de mal à la permutation rootViewControllers avec animation. Voici le code que j'utilise:
[UIView transitionWithView:self.window duration:0.8 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
self.window.rootViewController = self.navigationController;
} completion:nil];
Ça fonctionne sauf que juste avant l'animation, l'écran devient noir et puis l'animation se produit. Il ressemble à l'original rootViewController est de se retirer avant l'animation. Des idées?
Vous devez vous connecter pour publier un commentaire.
transitionWithView
est destiné à animer des sous-vues du conteneur spécifié vue. Il n'est pas si simple à animer la modification de la vue de la racine de contrôleur. J'ai passé un long moment à essayer de le faire w/o effets secondaires. Voir:Animer changement de point de vue contrôleurs sans utiliser de manette de navigation de la pile, les sous-vues ou modale des contrôleurs?
EDIT: ajout de l'extrait de référencé réponse
J'en suis conscient, c'est une très vieille question, cependant, ni accepté ni les solutions de rechange fourni une bonne solution (lorsque l'animation est terminée la barre de navigation de la nouvelle vue de la racine contrôleur cligna des yeux de la couleur blanche à la couleur d'arrière-plan, ce qui est très choquante).
J'ai corrigé cela en instantanés, le dernier écran de la première-vue-contrôleur, en superposition sur le deuxième (destination) - vue-contrôleur, puis de l'animer comme je le voulais après j'ai mis le second point de vue contrôleur en tant que root:
EDIT: Swift 3 version du code:
J'ai trouvé transitionWithView:durée:options:animations:achèvement: à produire un résultat fiable.
Si vous le laisser jusqu'à la fin du bloc de définir la vue racine ensuite, le contrôleur de cours de méthodes telles que la vue (/Ne)Apparaissent
Sera toujours mis à l'affichage précédent contrôleur. Cela peut ne pas être un problème dans la plupart des cas, sauf si vous avez besoin de passer sur cette référence à la rootViewController à l'autre code au cours de ces méthodes comme je l'ai fait.
La solution qui a fonctionné pour moi a été une légère modification de Marko Nikolovski de réponse. Mon existantes en vue de la racine contrôleur avait une animation spinner sur elle, donc un instantané regardé bizarre car il a gelé l'animation. En fin de compte, j'ai été capable de faire ce qui suit (à l'intérieur de la racine actif-vue-contrôleur):
Actuellement accepté de répondre (au moment de la rédaction de cette réponse) n'est pas idéal, car il ne pourrait pas position des éléments de l'INTERFACE comme la barre de navigation correctement lors de l'animation ou conduire à d'autres disposition de pépins comme décrit dans Marko Nikolovski réponse. Cependant, en poussant un instantané de la vue actuelle du contrôleur de la vue sur le haut de la fenêtre du contrôleur de la vue pour l'animation des fins n'est pas idéal, car il ne peut pas être utilisé pour afficher les contrôleurs à tout type d'animation qui se passe au cours de la transition à la prochaine vue contrôleur comme un instantané est juste un image statique.
Prendre cclogg l'idée de base voici ma mise en œuvre pour une transition en douceur entre les deux contrôleurs qui ne s'inquiète pas de valeurs alpha:
Il est important de remplacer la fenêtre
rootViewController
avant initier la transition ou de l'animation parce que c'est la façon dont le nouveau-vue-contrôleur fait la connaissance de son contexte, c'est à dire la bonne mise en page marges etc.C'est une voie à suivre si vous vraiment besoin de remplacer la fenêtre
rootViewController
pour quelque raison que ce soit. Cependant, je tiens à souligner que, d'un point de vue architectural, la meilleure approche à mon avis est de créer une vue contrôleur qui est seul responsable de la gestion des transitions entre les deux autre point de vue et contrôleurs de jeu de l'un comme de la fenêtrerootViewController
et puis jamais changer. C'est bien expliqué dans cette réponse à une question similaire.Au lieu d'échange rootViewControllers, pourquoi ne pas vous créer un Affichage personnalisé, ou peut-être juste un UINavigationController (ne pas afficher la barre de titre) et de mettre le "rootViews" vous voulez échanger entre les sous que.