J'ai eu un problème où j'avais une série de séquences CATransition / CAAnimation qui se chevauchaient, dont j'avais besoin pour effectuer des opérations personnalisées lorsque les animations s'arrêtaient, mais je ne voulais qu'un seul gestionnaire de délégué pour animationDidStop.
Cependant, j'ai eu un problème, il ne semblait pas y avoir de moyen d'identifier de manière unique chaque CATransition / CAAnimation dans le délégué animationDidStop.
J'ai résolu ce problème via le système clé / valeur exposé dans le cadre de CAAnimation.
Lorsque vous démarrez votre animation, utilisez la méthode setValue sur CATransition / CAAnimation pour définir vos identificateurs et valeurs à utiliser lorsque animationDidStop se déclenche:
-(void)volumeControlFadeToOrange
{
CATransition* volumeControlAnimation = [CATransition animation];
[volumeControlAnimation setType:kCATransitionFade];
[volumeControlAnimation setSubtype:kCATransitionFromTop];
[volumeControlAnimation setDelegate:self];
[volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
volumeControlLevel.enabled = true;
[volumeControlAnimation setDuration:0.7];
[volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
[[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];
}
- (void)throbUp
{
doThrobUp = true;
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromTop];
[animation setDelegate:self];
[hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
[animation setDuration:2.0];
[animation setValue:@"Throb" forKey:@"MyAnimationType"];
[[hearingAidHalo layer] addAnimation:animation forKey:nil];
}
Dans votre délégué animationDidStop:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
if ([value isEqualToString:@"Throb"])
{
//... Your code here ...
return;
}
if ([value isEqualToString:@"Special1"])
{
//... Your code here ...
return;
}
//Add any future keyed animation operations when the animations are stopped.
}
L'autre aspect de ceci est qu'il vous permet de conserver l'état dans le système d'appariement clé-valeur au lieu d'avoir à le stocker dans votre classe de délégué. Moins il y a de code, mieux c'est.
N'oubliez pas de consulter la référence Apple sur le codage des paires de valeurs clés .
Existe-t-il de meilleures techniques pour l'identification CAAnimation / CATransition dans le délégué animationDidStop?
Merci, --Batgar
CAAnimation
l » delegate
est forte, de sorte que vous pourriez avoir besoin de le mettre à nil
éviter de conserver les cycles!