web-dev-qa-db-fra.com

Que fait exactement le paramètre bool dans animateWithDuration: animations: complétion:

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

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

Mais je trouve que peu importe que vous utilisiez le paramètre bool ou non, le completion: le bloc s'exécutera toujours après animations: bloquer. Tout comme les deux simples extraits de code d'animation basés sur des blocs illustré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 le premier (même l'exemple de doc officiel d'Apple). Alors,

  • quel est le paramètre finished utilisé ici exactement?
  • ou quelle sera la situation sera utilisée?
66
Kjuly

Le paramètre fini sera NO lorsque l'animation a été annulée: généralement, lorsque vous avez interrompu l'animation pour en démarrer une autre (par exemple, vous avez commencé une nouvelle animation, avant la fin de l'animation actuelle, avec le paramètre pour commencer à partir de l'état actuel) ou vous avez directement annulé l'animation.

En effet, cela annule l'animation actuelle, 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, vous ne continueriez donc que la chaîne de l'animation précédente terminée.

Par exemple, imaginez que vous ayez eu un jeu où une bombe volait à travers l'écran. Si l'utilisateur n'appuie pas sur 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 quelque chose.

Si l'utilisateur appuie sur la bombe, vous annulez l'animation en mouvement et faites voler la bombe sans danger. Votre bloc d'achèvement d'origine serait toujours exécuté, vous devez donc savoir si l'animation s'est terminée seule ou a été annulée.

94
jrturton