Tive um problema em que havia uma série de sequências CATransition / CAAnimation sobrepostas, todas as quais eu precisava para realizar operações personalizadas quando as animações parassem, mas eu queria apenas um manipulador delegado para animationDidStop.
No entanto, eu tive um problema, não parecia haver uma maneira de identificar exclusivamente cada CATransition / CAAnimation no delegado animationDidStop.
Resolvi esse problema por meio do sistema de chave / valor exposto como parte do CAAnimation.
Ao iniciar sua animação, use o método setValue em CATransition / CAAnimation para definir seus identificadores e valores a serem usados quando o animationDidStop for acionado:
-(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];
}
Em seu delegado 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.
}
O outro aspecto disso é que ele permite que você mantenha o estado no sistema de emparelhamento de valor-chave em vez de ter que armazená-lo em sua classe de delegado. Quanto menos código, melhor.
Certifique-se de verificar a Referência da Apple sobre codificação de pares de valores-chave .
Existem técnicas melhores para identificação de CAAnimation / CATransition no delegado animationDidStop?
Obrigado, - Batgar
CAAnimation
's delegate
é forte, então talvez seja necessário configurá-lo para nil
evitar reter ciclos!