¿Cómo eliminar un object CALayer de animationDidStop?

Estoy intentando aprender core-animation para iOS / iPhone. Mi capa raíz contiene muchas subcapas (sprites) y debería girar cuando se eliminan …

Mi plan era agregar una animation giratoria y luego eliminar el sprite cuando se invoca animationDidStop. ¡El problema es que la capa de sprite no es un parámetro para animationDidStop!

¿Cuál es la mejor forma de encontrar la capa de sprite específica de animationDidStop? ¿Hay una forma mejor de hacer girar el sprite cuando se elimina? (idealmente me gustaría usar kCAOnOrderOut pero no pude hacerlo funcionar)

-(void) eraseSprite:(CALayer*)spriteLayer { CABasicAnimation* animSpin = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; animSpin.toValue = [NSNumber numberWithFloat:2*M_PI]; animSpin.duration = 1; animSpin.delegate = self; [spriteLayer addAnimation:animSpin forKey:@"eraseAnimation"]; } - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ // TODO check if it is an eraseAnimation // and find the spriteLayer CALayer* spriteLayer = ?????? [spriteLayer removeFromSuperlayer]; } 

Encontré esta respuesta aquí cocoabuilder, pero básicamente agrega un valor key a CABasicAnimation para CALayer que está siendo animado.

 - (CABasicAnimation *)animationForLayer:(CALayer *)layer { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; /* animation properties */ [animation setValue:layer forKey:@"animationLayer"]; [animation setDelegate:self]; return animation; } 

Luego, házlo reference en la callback animationDidStop

 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { CALayer *layer = [anim valueForKey:@"animationLayer"]; if (layer) { NSLog(@"removed %@ (%@) from superview", layer, [layer name]); [layer removeFromSuperlayer]; } } 

Puede tener un iVar iTempSpriteLayer de tipo `CALayer.

 @property (nonautomic, assign) CALayer* iTempSpriteLayer; 

 -(void) eraseSprite:(CALayer*)spriteLayer { iTempSpriteLayer = spriteLayer; ........................... } - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ // TODO check if it is an eraseAnimation // and find the spriteLayer if(iTempSpriteLayer) [iTempSpriteLayer removeFromSuperlayer]; iTempSpriteLayer = nil; }