33 votes

Utilisation appropriée de transitionFromViewController: toViewController: durée: options: animations: achèvement:

Je n'arrive pas à trouver un bon exemple sur la façon d'utiliser transitionFromViewController:toViewController:duration:options:animations:completion: correctement.

Est-ce correct? (en supposant que je veux changer de VC avec l'autre)

// Assume fromVC and toVC view controllers are defined and fromVC is already added as a child view controller
[self addChildViewController:toVC];

[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:NULL completion:^(BOOL finished) {
    [fromVC willMoveToParentViewController:nil];
    [fromVC removeFromParentViewController];
    [toVC didMoveToParentViewController:self];
}];

La documentation n'est pas claire au sujet de quand faire appel à ce que:

Le addChildViewController: les appels de méthode à l' willMoveToParentViewController: méthode de la vue contrôleur ajouté comme un enfant avant de l'ajouter, mais il n'appelle pas la didMoveToParentViewController: méthode. Le conteneur de-vue-contrôleur la classe doit appeler le didMoveToParentViewController: de la vue enfant contrôleur après le passage à la nouvelle de l'enfant est complet ou, si il n'y a pas de transition, immédiatement après l'appel de la addChildViewController: méthode.

De même, il est de la responsabilité du conteneur de-vue-contrôleur pour appeler la willMoveToParentViewController: avant l'appel de la méthode removeFromParentViewController: méthode. L' removeFromParentViewController: les appels de méthode à l' didMoveToParentViewController: méthode de l'enfant-vue-contrôleur.

Une autre chose est, comment utilisez-vous les animations bloc dans ce cas? Avis dans le code ci-dessus, je viens de mettre NULL. (Je suis familier avec bloc en soi, je ne suis pas sûr de quoi mettre exactement dans celui-ci)

59voto

Sean Points 4203

J'ai mis en place ce genre de chose de la même façon dans le passé. Mais, je voudrais déplacer -willMoveToParentViewController: en dehors de l'achèvement de bloc depuis ce point de vue contrôleur doit en être informé avant qu'il ne passe (c'est à dire, par les temps de la fin bloc a terme, fromVC a déjà eu son parent VC ensemble d' nil. Donc dans l'ensemble, quelque chose comme ceci:

[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];

[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{} completion:^(BOOL finished) {
    [fromVC removeFromParentViewController];
    [toVC didMoveToParentViewController:self];
}];

En termes d'animations, vous ne devriez jamais mettre ce paramètre à l' NULL, selon la documentation de la méthode. Si vous n'avez pas d'afficher les propriétés que vous souhaitez animer, alors vous pouvez simplement passer un bloc vide ^{}. Fondamentalement, ce paramètre est utilisé pour animer les propriétés de votre point de vue à votre point de vue de la hiérarchie au cours de la transition. La liste des propriétés animables peut être trouvé dans la UIView de la documentation en vertu de la "Animations" de la rubrique. Comme un exemple, disons que vous ne voulez pas que votre point de vue l'ensemble géré par fromVC de fondu enchaîné, mais ne veulent qu'une seule sous-vue à son point de vue de la hiérarchie nommé subview1 à s'estomper. Vous pouvez faire cela en utilisant les animations bloc:

[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];

[self transitionFromViewController:fromVC 
                  toViewController:toVC
                          duration:0.3
                           options:UIViewAnimationOptionTransitionNone
                        animations:^{
                                       [subview1 setAlpha:0.0];
                                   }
                        completion:^(BOOL finished) {
                                       [fromVC removeFromParentViewController];
                                       [toVC didMoveToParentViewController:self];
                                   }];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X