Как удалить объект CALayer из animationDidStop? - PullRequest
7 голосов
/ 13 июня 2011

Я пытаюсь изучить core-анимацию для iOS / iPhone. Мой корневой слой содержит много подслоев (спрайтов), и они должны вращаться при их удалении ...

Мой план состоял в том, чтобы добавить вращающуюся анимацию, а затем удалить спрайт при вызове animationDidStop. Проблема в том, что спрайтовый слой не является параметром animationDidStop!

Каков наилучший способ найти определенный слой спрайта от animationDidStop? Есть ли лучший способ заставить спрайт вращаться после его удаления? (в идеале я хотел бы использовать kCAOnOrderOut, но я не мог заставить его работать)

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

Ответы [ 2 ]

24 голосов
/ 05 октября 2011

Нашел ответ здесь cocoabuilder , но в основном вы добавляете ключевое значение к CABasicAnimation для CALayer, который анимируется.

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

Затем укажите ссылку в обратном вызове animationDidStop

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
 {
     CALayer *layer = [anim valueForKey:@"animationLayer"];
     if (layer) {
         NSLog(@"removed %@ (%@) from superview", layer, [layer name]);
         [layer removeFromSuperlayer];
     }
 }
0 голосов
/ 13 июня 2011

Вы можете иметь iVar iTempSpriteLayer типа `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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...