2012-05-02 15 views
15

nunca he pensado en la BOOL finished regresado de un manejador de finalización de animación UIView, pero la lectura de un código de ejemplo en la Guía de programación de Apple UIView muestra esto:¿Es necesario probar el BOOL finalizado en un controlador de finalización para la animación de UIView?

completion:^(BOOL finished) { 
if (finished) { 

es necesario? El bloque de finalización no debería ejecutarse a menos que la animación haya terminado de todos modos, ¿verdad? La prueba parece redundante.

Respuesta

7

La acción real emprendida en ese fragmento de código es bastante significativa. La animación está pasando de una vista a otra: la primera se reemplaza y luego se establece un booleano para realizar un seguimiento de cuál se muestra actualmente. El valor booleano se establece en el bloque de finalización.

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView) 
    toView:(displayingPrimary ? secondaryView : primaryView) 
    duration:1.0 
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight : 
       UIViewAnimationOptionTransitionFlipFromLeft) 
    completion:^(BOOL finished) { 
     if (finished) { 
      displayingPrimary = !displayingPrimary; 
     } 
}]; 

En este caso, si la animación (por cualquier razón) no se completa, entonces los puntos de vista que no se han intercambiado, y a pesar de todo no quieren dar la vuelta al valor de displayingPrimary, porque' Tendré un registro inexacto de su estado. Es por eso que el indicador finished está marcado en este caso.

Observe que en la mayoría (si no todos) de los demás ejemplos de código en esa guía, el indicador no está marcado; eso es porque no es significativo en esos casos (ejecutando otra animación después del primero, por ejemplo, o cambiando algún valor que no depende de la finalización exitosa de la animación).

+2

por lo que parece que un bloque de finalización puede ejecutarse incluso si el bool finalizado es cero. ¿Por qué sucedería eso? ya que es un bloque de "finalización", ¿no se ejecutaría solo si el bloque anterior realmente se completó? – johnbakers

+1

Al iniciar una nueva animación con uno de esos métodos, hay una opción para que la nueva interrumpa la primera. También hay una opción para permitir la interacción del usuario con la vista, lo que puede presentar una oportunidad para cancelar la animación. –

+0

Según doc the transitionFromView agregue the toView al COMIENZO de la animación y obtenga fromView out de superView al FINAL de la animación. ¿Eso quiere decir que si terminado es falso que AMBOS fromView y toView todavía está allí? Porque en mi caso, he visto casos donde los dos se han ido. –

3

Sí, realmente deberías honrar a ese bool en tu controlador. El usuario puede iniciar la animación, pero antes de que la animación se complete normalmente, el usuario hace otra cosa para cancelarla antes. Este bool bien le permite saber de tales casos.

- update - Solo para elaborar. Imagina alguna animación que mueve una vista a través de la pantalla. El controlador puede disparar cuando la vista se mueve. Supongamos que el usuario toca en otro lugar para causar una nueva animación que esencialmente cancela esta primera en progreso. Puedes usar el bool provisto para detectar eso.

+0

¿Está sugiriendo que incluso si se cancela la animación, el controlador de finalización aún se puede ejecutar? – johnbakers

+0

Con suerte, alguien me preguntará quién tiene más confianza que yo en esto, pero sí, creo que ese es el caso. No se cancela antes de que se ejecute, pero se interrumpe antes de que pudiera completarse. –

+0

El bloque de finalización solo tiene un significado y debe validarlo y usarlo solo si necesita hacer algo específico después de que la animación se haya completado correctamente. Si no te importa lo que sucede con la animación, no tiene sentido validar si la animación se completó con éxito ... – Lefteris

Cuestiones relacionadas