2009-01-03 6 views
6

Je crée une application sur iPhone et j'ai plusieurs UIViews et couches. Je fais des animations en utilisant la classe CAKeyframeAnimation et comme les animations doivent être chaînées, j'ai remplacé la méthode animationDidStop dans UIView.J'ai besoin d'aide pour les rappels d'animation (iPhone)

Je reçois les rappels correctement, mais je ne pouvais pas comprendre comment je pouvais trouver quelle animation était terminée afin que je puisse commencer le suivant. Seuls les paramètres de la fonction de rappel sont un objet CAAnimation et un booléen.

Je peux contourner ce problème en définissant une propriété dans la classe et en utilisant une énumération pour les diverses animations que j'utilise. Cependant, je voulais juste savoir s'il y a des attributs intégrés dans les callbacks que je peux définir dans l'objet CAKeyframeAnimation et ensuite faire référence dans le callback.

Toute aide serait grandement appréciée!

Répondre

11

Je sais que vous avez dit que vous utilisez CAKeyframeAnimations, mais si vous voulez une animation simple des propriétés UIView (origine, bounds, alpha, etc.), vous pouvez envelopper le changement de la propriété ou des propriétés dans un début/commit block et spécifie une méthode déléguée appelée à la fin de l'animation. Tant que la méthode delegate prend trois arguments, vous pouvez l'appeler comme vous voulez. Par exemple:

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

provoquera la méthode

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

à appeler. Le nommage arbitraire que cela permet de vous fournir un moyen de séparer la manipulation pour l'achèvement de différentes animations. Je préfère cela pour les animations simples.

Pour traiter des animations plus complexes qui interagissent directement avec CALayers, la méthode animationDidStop: finished: delegate renvoie l'objet d'animation terminé. Si vous créez une instance qui est le délégué pour plusieurs animations, vous pouvez créer un NSMutableDictionary d'animations et NSNumbers à utiliser dans une instruction switch dans la méthode animationDidStop: finished:. Lorsque vous créez CAKeyframeAnimation, utilisez setObject: forKey: pour l'affecter à son numéro correspondant, puis utilisez objectForKey: pour rechercher le numéro correspondant à cette animation dans la méthode d'achèvement et l'insérer dans une instruction switch.

13

Vous pouvez spécifier un nom pour une animation et le lire dans la méthode déléguée.

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

...

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

je ne pourrais pas le modifier, mais il a besoin @ avant "firstAnimation" à la ligne [animation setValue: "firstAnimation" forKey: @ "nom"]; – efeyc