2010-09-22 5 views
8

Sabemos que UIImageView tiene un soporte muy bueno para la animación de secuencia de imágenes. Podemos crear fácilmente una matriz de objetos UIImage, establecer la propiedad animationImages, configurar la duración de la animación, repetir el conteo, etc. y luego simplemente disparar. Pero parece que no hay forma de saber cuándo ha terminado esta animación.iPhone: la mejor manera de detectar el final de la animación de secuencias de imágenes UIImageView

Digamos que tengo diez imágenes y luego quiero ejecutar una animación (repetir conteo = 1) con ellas. Y cuando termine la animación, quiero ejecutar otro código. ¿Cuál es la mejor manera de saber que la animación ha terminado?

Ya entiendo que puedo crear un NSTimer y programarlo para que se active después de la duración de la animación. Pero realmente no puede confiar en el temporizador si necesita una buena precisión.

Así que mi pregunta es, ¿hay alguna forma mejor de saber que una animación de secuencia de imágenes UIImageView ha finalizado sin usar el temporizador?

El código es algo como esto

 
myImageView.animationImages = images; // images is a NSArray of UIImages 
myImageView.animationDuration = 2.0; 
myImageView.animationRepeatCount = 1; 

[myImageView startAnimating] 
+0

editado con algún código de muestra – taskinoor

+1

¿Has probado usar un temporizador? Es cierto que el tiempo no es 100% exacto, pero AFAIK tampoco puede confiar en el tiempo de otras animaciones. No me sorprendería si la animación UIImageView incorporada usa un temporizador en sí mismo. –

+0

ya he probado el cronómetro. de hecho, esto es lo que estoy usando en este momento. esto está bien para muchos casos, pero bueno ... no 100% :-) – taskinoor

Respuesta

8

La propiedad isAnimating en UIImageView debe ir a NO cuando se hace la animación. Sin embargo, no es una propiedad formal, por lo que no puede establecer una observación sobre ella. Puede sondearlo en un temporizador de grano fino (como CADisplayLink).

No hay un delegado de "animación completada" para esto, si ese es el tipo de cosa que está buscando. El tiempo puede ser variable en función del retraso de carga de las imágenes, etc., y no, no hay una forma segura de saber con precisión cuándo se hace.

La animación de imagen en UIImageView es una conveniencia, y no lo suficientemente pesada como para hacer un trabajo de animación serio. Considera hacer tu propia versión si necesitas ese tipo de precisión.

+0

ya, también creo que eventualmente necesito manejar esto por mi cuenta. Solo quería estar seguro de que no me faltaba nada y no había otra alternativa. – taskinoor

+0

No estoy seguro de lo que quiere decir con "propiedad formal". Definitivamente es una propiedad, pero UIImageView probablemente no llame al colocador (sospecho que no hay ninguno). –

1

Hice esto (método de mi subclase UIImageView).

-(void)startAnimatingWithCallback:(UIImageViewAnimationCompletitionBlock) completitionCallback 
{ 
    [self startAnimating]; 

    dispatch_queue_t animatingQueue = dispatch_get_current_queue(); 
    dispatch_queue_t pollingQueue = dispatch_queue_create("pollingQueue", NULL); 
    dispatch_async(pollingQueue, ^{ 

     while(self.isAnimating) { usleep(10000); } 
     dispatch_async(animatingQueue, ^{ if (completitionCallback) completitionCallback(); }); 

    }); 
} 

Uso simple:

[self.oneView fadeOut]; 
[self.otherView startAnimatingWithCallback:^ 
{ 
    [self.oneView fadeIn]; 
}]; 
+0

Uno de los peores hack: el bucle while encierra una CPU (hasta 100%) y drena rápidamente la batería. – CouchDeveloper

+0

Yap en realidad este ciclo de "endlessie" no es la mejor idea, incluso en el fondo. De todos modos, de todos modos, lo he usado solo por unos segundos. – Geri

+1

Puede agregar un 'usleep (10000);' para aliviar el problema. De lo contrario, se arriesga a que se le acuse de ser el motivo de los problemas de la batería en dispositivos Apple: P – CouchDeveloper

0

Además podría recomendar imagen predeterminada de la UIImageView el establecimiento (propiedad image) en el primer cuadro de la animación y el cambio a la última trama justo después de lanzar la animación (Método startAnimating). De esta forma evitamos el feo blick que puede ocurrir cuando la animación finaliza, pero no se invoca la devolución de llamada.

Cuestiones relacionadas