2010-12-15 54 views
4

I ont vu How to identify CAAnimation within the animationDidStop delegate?, ceci est un ajout.Comment identifier CAAnimation dans le délégué et le contrôleur de version?

Je n'arrive pas à faire fonctionner correctement cette fonction. J'ai une animation, et je voudrais libérer le contrôleur qu'il a été exécuté après la fin de l'animation. Exemple: Le contrôleur traduit de droite -> gauche puis se libère.

Définition de l'animation:

NSValue *end = [NSValue valueWithCGPoint:CGPointMake(800, self.view.center.y)]; 
NSValue *start = [NSValue valueWithCGPoint:self.view.center]; 

CABasicAnimation *moveAnimation;   
moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
moveAnimation.duration = 0.45f; 

moveAnimation.fromValue = start; 
moveAnimation.toValue = end; 

// actually set the position 
[self.view.layer setPosition:[end CGPointValue]]; 

moveAnimation.delegate = self; 
moveAnimation.removedOnCompletion = NO; 
[self.view.layer addAnimation:moveAnimation forKey:MOVING_OUT]; 

intérieur de la méthode déléguée:

- (void) animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    CAAnimation *check = [self.view.layer animationForKey:MOVING_OUT]; 

    if (theAnimation == check) 
    { 
     //[check release]; 
     [self release]; 

    } 
} 

Si je quitte ce code tel quel, mon contrôleur n'obtient pas dealloc'd (en raison de la conserver appel par l'animation). Si je cours [check release], j'obtiens le message sent to deallocated instance.

Est-ce que quelqu'un sait ce qui ne va pas? Existe-t-il un autre moyen d'identifier un CAAnimation dans le délégué animationDidStop SANS spécifier removedOnCompletion = NO?

EDIT: Oublié de mentionner. En ne spécifiant pas que removedOnCompletion = NO, animationForKey: renverra la valeur NULL. Par conséquent, je suis incapable d'identifier l'animation.

Merci!

Répondre

3

Il est pas clair ce que votre problème est ici, mais il peut vous aider à savoir que CAAnimation instances sont des conteneurs KVO génériques, de sorte que vous pouvez ajouter des informations sur mesure pour eux

[myAnimation setValue: @"check" forKey: @"name"]; 

Vous pouvez ensuite vérifier contre cette :

if ([[theAnimation valueForKey: @"name"] isEqual: @"check"]) 
    // ... 

Cela aide-t-il?

+0

Malheureusement, j'ai essayé aussi. S'il vous plaît voir ma modification ci-dessus. – mmilo

+0

Combinez les trucs KVO avec 'removedOnCompletion' :) –

+0

removedOnCompletion = YES est exactement ce qui était nécessaire pour moi! Merci! Mais pour signaler aux autres, j'ai vérifié la documentation et les valeurs par défaut removedOnCompletion à OUI, je l'avais involontairement mis à NON dans certains tests pensant qu'il faisait quelque chose d'autre. – DonnaLea

4

Je pense que la raison éventuelle est CAAnimation.delegate est une propriété retain (très étrange oups!).

La définition du fichier d'en-tête est:

/* The delegate of the animation. This object is retained for the 
* lifetime of the animation object. Defaults to nil. See below for the 
* supported delegate methods. */ 

@property(retain) id delegate; 

Pour que l'auto se libérer, l'animation doit être retirée de la couche, comme:

[self.view.layer removeAnimationForKey:@THE_ANIMATION_KEY];