2009-01-03 8 views
6

Estoy creando una aplicación en iPhone y tengo varias UIViews y capas en ella. Estoy haciendo algunas animaciones usando la clase CAKeyframeAnimation y dado que las animaciones tienen que estar encadenadas, he reemplazado el método animationDidStop en UIView.Necesito ayuda con las devoluciones de llamadas de animación (iPhone)

Estoy obteniendo las devoluciones de llamada correctamente, sin embargo, no pude averiguar cómo puedo encontrar qué animación se terminó para poder comenzar la siguiente. Solo los parámetros de la función de devolución de llamada son un objeto CAAnimation y un booleano.

Puedo solucionar este problema estableciendo una propiedad en la clase y usando una enumeración para las diversas animaciones que uso. Sin embargo, solo quería saber si hay atributos incorporados en las devoluciones de llamada que puedo establecer en el objeto CAKeyframeAnimation y luego referirme a los mismos en la devolución de llamada.

¡Cualquier ayuda sería muy apreciada!

Respuesta

11

Sé que ha dicho que está utilizando CAKeyframeAnimations, pero si desea una animación simple de las propiedades de UIView (origen, límites, alfa, etc.), puede ajustar el cambio de la propiedad o propiedades en un comienzo/cometer bloque y especificar un método delegado que se invoque al finalizar la animación. Siempre que el método de delegado tome tres argumentos, puede llamarlo como lo desee. Por ejemplo:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(yourAnimationHasFinished:finished:context:)]; 
// Change property or properties here 
[UIView commitAnimations]; 

hará que el método

- (void)yourAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context; 

a ser llamados. La denominación arbitraria que esto le permite proporcionarle un medio de separar el manejo para completar diferentes animaciones. Prefiero esto para animaciones simples.

Para tratar animaciones más complejas que interactúan directamente con CALayers, el método animationDidStop: finished: delegate devuelve el objeto de animación que ha finalizado. Si está creando una instancia delegado para múltiples animaciones, puede crear un NSMutableDictionary de animaciones y NSNumbers para utilizar en una declaración switch dentro del método animationDidStop: finished :. Al crear CAKeyframeAnimation, use setObject: forKey: para asignarlo a su número coincidente, luego use objectForKey: para encontrar el número que corresponde a esa animación en el método de finalización y alimentarlo en una instrucción switch.

13

Puede especificar un nombre para una animación y leerlo en su método de delegado.

[animation setValue:"firstAnimation" forKey:@"name"]; 

...

- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished { 
    if([[animation valueForKey:@"name"] isEqual:@"firstAnimation"] && finished) { 
    ... 
    } 
} 
+1

no pude editarlo, pero necesita @ antes "firstAnimation" a la línea [animación setValue: forKey "firstAnimation": @ "nombre"]; – efeyc

Cuestiones relacionadas