2010-07-28 5 views
1

Je Tring pour être averti lorsque l'animation démarre et arrête, donc mon code est:Pourquoi animationDidStart: ne fonctionne pas?

[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; 
[UIView setAnimationWillStartSelector:@selector(animationDidStart:)]; 

je mettre en œuvre ces 2 méthodes, mais animationDidStop:finished: mais j'ai notifié, et ne l'ont pas animationDidStart:.

Voici mon implémentation:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
} 

- (void)animationDidStart:(CAAnimation *)anim 
{ 
} 

Quand j'ai essayé d'appeler directement animationDidStart: ou animationDidStop:finished:, mon application tombé en panne et a signalé que le sélecteur n'a pas été trouvé. Mais selon les lignes suivantes dans CAAnimation.h, si j'importe le framework QuatzCore, toutes les instances de NSObject devraient répondre à ces 2 méthodes. Est-ce que ma compréhension est correcte?

/* Delegate methods for CAAnimation. */ 

@interface NSObject (CAAnimationDelegate) 

/* Called when the animation begins its active duration. */ 

- (void)animationDidStart:(CAAnimation *)anim; 

/* Called when the animation either completes its active duration or 
* is removed from the object it is attached to (i.e. the layer). 'flag' 
* is true if the animation reached the end of its active duration 
* without being removed. */ 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; 

@end 

Répondre

1

Selon la documentation UIView le message setAnimationWillStartSelector: attend un sélecteur avec une signature comme le + (void)beginAnimations:(NSString *)animationID context:(void *)context. Le sélecteur que vous fournissez a une mauvaise signature et ne sera donc pas appelé. La catégorie CAAnimationDelegate de NSObject n'est même pas documentée, vous devez donc probablement savoir exactement ce que vous faites. Cependant, votre problème est la mauvaise signature du sélecteur.

+0

Je suis un peu confus. Je pense que la catégorie CAAnimationDelegate à NSObject est documentée dans: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/instm/NSObject/ animationDidStart: –

+0

un mot sur la terminologie: 'CAAnimation' n'est pas une" catégorie ", mais" hérite "de' NSObject', qui ne dit rien de plus que c'est en fait un objet. 'CAAnimationDelegate' est un protocole, qui est un ensemble de règles indiquant les méthodes que vous devez/pouvez utiliser pour établir une interaction. – mvds

+0

@MQ Gu: Vous avez raison, je n'ai pas pris assez de temps pour la recherche, désolé! Mais cela ne change rien à votre problème. CAAnimation est une classe abstraite, utilisée (implémentée) par UIView pour effectuer les animations de base. Vous devez utiliser le sélecteur défini par UIView pour que votre code fonctionne. – thatsdisgusting

2

La lecture du manuel Très bien, je vois

The selector should have the same arguments as the beginAnimations:context: method, 
an optional application-supplied identifier and context. Both of these arguments can 
be nil. 

Je présume que vous pourriez au moins faire le sélecteur manger les bons arguments.

Il semble que vous implémentez un protocole différent, jetez un coup d'œil aux docs UIView.

+0

Oui, cela devrait être la raison pour laquelle le délégué n'a pas été appelé. Je vais essayer tard et ajouterai un rapport ici. Mais j'ai encore un peu de confusion sur le fait que la catégorie CAAnimationDelegate de NSObject devrait être valide, quand je les ai appelés directement. –

+0

?? Je ne vous comprends pas exactement, mais ça ne marche pas comme ça. Vous définissez le délégué et le sélecteur. Ensuite, le sélecteur est appelé avec 2 arguments, l'identifiant et le contexte (qui peut être juste "nil"). C'est tout. Pas de 'NSObject', pas de' CAAnimationDelegate', pas de catégorie. 'CAAnimation' est juste une autre façon d'animer les choses. Ne le mélangez pas avec la façon d'animer 'UIView'. – mvds

0

Dans votre bloc d'animation UIView, le réglage des sélecteurs devrait ressembler à ceci:

[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
Questions connexes