2011-12-31 10 views
52

que se refiere a la DOC y dijo:¿Qué hace exactamente parámetro bool hacer en animateWithDuration: animaciones: completado:

finalización
... Este bloque tiene ningún valor de retorno y toma un solo booleana argumento que indica si las animaciones realmente terminaron antes de que se llamara al controlador de finalización. ...

Pero me parece que no importa que utilice el parámetro bool o no, el bloque completion: siempre se ejecutará después de animations: bloque. Al igual que los dos simples fragmentos de código de animación basados ​​en bloques que se muestran a continuación, ambos hacen lo mismo.

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

y

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

Y me parece que la mayoría de la gente (incluido yo) utilizan el primero de ellos (incluso ejemplo oficial de documentación de la manzana). Entonces,

  • ¿cuál es el parámetro finished usado aquí exactamente?
  • o ¿cuál es la situación se utilizará?
+1

Una gran pregunta, nunca me pregunté sobre esto hasta que mi código creaba animaciones causantes de ataques hoy. Gracias por preguntar esto! –

Respuesta

76

El parámetro terminado será NO cuando se canceló la animación: típicamente, cuando ha interrumpido la animación para iniciar otra (por ejemplo, ha comenzado una nueva animación, antes de la actual, con el parámetro comenzar desde el estado actual) o ha cancelado directamente la animación.

En efecto, esto cancela la animación actual, pero todavía se invoca el bloque de finalización. Si estuvieras encadenando una secuencia de animaciones, querrías que esa cadena se detuviera, por lo que solo continuarías la cadena de la animación anterior que había terminado.

Como ejemplo, imagine que tenía un juego donde una bomba volaba por la pantalla. Si el usuario no toca la bomba, explota cuando alcanza el borde. Entonces tendrías una animación para mover la bomba, y tu bloque de finalización tendría otra animación para mostrar la explosión, y tal vez una llamada a algún método para disminuir una puntuación o algo así.

Si el usuario toca la bomba, cancelaría la animación en movimiento y haría que la bomba volara inofensivamente. Su bloque de finalización original todavía se ejecutará, por lo que necesitaría saber si la animación había finalizado por sí misma o si se había cancelado.

+1

Gracias por su respuesta! "_ha interrumpido la animación para iniciar otra one_", esa puede ser la situación para usar este parámetro! ¿Pero puedes ofrecer un ejemplo simple? : p "_Si encadenabas una secuencia de animaciones querrías que la cadena se detuviera, por lo que solo continuarías la cadena de la animación anterior había terminado_", pero no continuará la cadena de animaciones hasta que la anterior haya terminado sin el parámetro 'finished', tampoco. Lo hice de esta manera (sin la instrucción 'if') para la secuencia de animaciones en mi aplicación y sin ningún error de orden incorrecto. – Kjuly

+6

He agregado un ejemplo simple. – jrturton

+0

¡Un ejemplo interesante y claro! ¡Gracias! – Kjuly

Cuestiones relacionadas