Tuve un problema en el que tenía una serie de secuencias CATransition / CAAnimation superpuestas, todas las cuales necesitaba realizar operaciones personalizadas cuando las animaciones se detenían, pero solo quería un controlador delegado para animationDidStop.
Sin embargo, tuve un problema, no parecía haber una forma de identificar de forma única cada CATransition / CAAnimation en el delegado animationDidStop.
Resolví este problema a través del sistema clave / valor expuesto como parte de CAAnimation.
Cuando comiences tu animación, usa el método setValue en CATransition / CAAnimation para configurar tus identificadores y valores para usar cuando animationDidStop se active:
-(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];
}
En su 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.
}
El otro aspecto de esto es que le permite mantener el estado en el sistema de emparejamiento de valor clave en lugar de tener que almacenarlo en su clase delegada. Cuanto menos código, mejor.
Asegúrese de consultar la Referencia de Apple sobre codificación de pares de valores clave .
¿Existen mejores técnicas para la identificación de CAAnimation / CATransition en el delegado animationDidStop?
Gracias, - Batgar
CAAnimation
's delegate
es fuerte, por lo que puede que tenga que configurarlo para nil
evitar retener ciclos!