2011-06-13 21 views
7

Estoy tratando de aprender core-animation para iOS/iPhone. Mi capa de raíz contiene muchas subcapas (sprites) y deben girar cuando se eliminan ...Cómo eliminar un objeto CALayer de animationDidStop?

Mi plan era añadir una animación de giro y luego eliminar el elemento cuando se invoca animationDidStop. ¡El problema es que la capa de sprites no es un parámetro para animationDidStop!

¿Cuál es la mejor manera de encontrar la capa de sprite específica de animationDidStop? ¿Hay alguna manera mejor de hacer que el sprite gire cuando se elimina? (Idealmente me gustaría utilizar kCAOnOrderOut pero no pude hacer que funcione)

-(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]; 
} 

Respuesta

23

consideran que esta respuesta aquí cocoabuilder pero básicamente se agrega un valor clave a la CABasicAnimation para CALayer que se está animando.

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

A continuación, hacer referencia a ella en la devolución de llamada animationDidStop

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

Esta debería ser la respuesta, ya que la aceptada no funciona en múltiples sprites como la pregunta planteada. – Ian1971

+0

+1 respuesta correcta ... – Leena

+0

Bien, ahora he comprobado esta respuesta como la correcta. – ragnarius

0

usted podría tener un IvariTempSpriteLayer 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; 
} 
+0

+1, gracias, pero tengo muchos sprites y que se podrían suprimir simultáneamente (en la superposición de marcos de tiempo). – ragnarius

+0

Creo que la respuesta de Nate a continuación es la correcta. – Ian1971