65 votes

Que fait exactement le paramètre bool dans animateWithDuration:animations:completion :

J'ai fait référence à la DOC et il a dit :

achèvement des travaux
... Ce bloc n'a pas de valeur de retour et prend un seul argument booléen qui indique si les animations se sont terminées ou non avant l'appel du gestionnaire d'achèvement. ...

Mais je constate que, peu importe que vous utilisiez le paramètre bool ou non, la fonction completion: s'exécutera toujours après animations: bloc. Tout comme les deux extraits de code d'animation simple basée sur des blocs présentés ci-dessous, les deux font la même chose.

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 [myView removeFromSuperview];
             }];

et

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 if (finished) [myView removeFromSuperview];
             }];

Et je trouve que la plupart des gens (y compris moi) utilisent la première (même l'exemple de la doc officielle d'apple). Donc,

  • quel est le finished utilisé pour ce paramètre exactement ?
  • ou quelle est la situation qui sera utilisée ?

94voto

jrturton Points 64875

Le paramètre terminé sera NON lorsque l'animation a été annulée : typiquement, lorsque vous avez interrompu l'animation pour en commencer une autre (par exemple, vous avez commencé une nouvelle animation, avant que l'animation en cours ne soit terminée, avec le paramètre pour commencer à partir de l'état actuel) ou vous avez directement annulé l'animation.

En fait, cela annule l'animation en cours, mais le bloc d'achèvement est toujours appelé. Si vous enchaîniez une séquence d'animations, vous voudriez que cette chaîne s'arrête, donc vous ne poursuivriez la chaîne que lorsque l'animation précédente serait terminée.

Par exemple, imaginez que vous ayez un jeu dans lequel une bombe traverse l'écran. Si l'utilisateur ne touche pas la bombe, elle explose lorsqu'elle atteint le bord. Vous auriez donc une animation pour déplacer la bombe, et votre bloc d'achèvement aurait une autre animation pour montrer l'explosion, et peut-être un appel à une méthode pour diminuer un score ou autre.

Si l'utilisateur touche la bombe, vous annulez l'animation du mouvement et la bombe s'envole sans danger. Votre bloc d'achèvement d'origine serait toujours exécuté, et vous auriez besoin de savoir si l'animation s'est terminée d'elle-même ou a été annulée.

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