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!
Malheureusement, j'ai essayé aussi. S'il vous plaît voir ma modification ci-dessus. – mmilo
Combinez les trucs KVO avec 'removedOnCompletion' :) –
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