2013-07-16 2 views
2

Я делаю приложение iOS. У меня есть несколько CALayer объектов, которые в конечном итоге будут удален от (сокращение) анимация. Когда анимация завершена и вызывается animationDidStop:finished, я хотел бы удалитьCALayer объект с супер и удалите его.Как удалить слой, когда его анимация завершена?

  1. Но как я могу получить CALayer объект в animationDidStop:finished? Я бы догадался, что у объекта CAanimation есть указатель на слой, но я не могу найти его в документе.
  2. Есть ли лучший способ справиться с проблемой? (На самом деле, у меня есть несколько анимационных объектов добавлены в том же слое, и, в идеале, я хотел бы, чтобы удалить слой только тогда, когда последняя анимация завершается)

ответ

0

Когда вы создаете анимацию и устанавливаете делегат, просто передайте CALayer, который вы хотите удалить с помощью своей анимации.

Что касается удаления всех анимаций, у вас есть два варианта:

  1. Вы можете проверить animationKeys вашего CALayer для любых существующих анимаций.
  2. Вы можете использовать группу CAAnimationGroup и объединить все свои анимации.
+0

Я призываю * addAnimation: forKey: *, как я могу передать объект CALayer? – ragnarius

+1

У вас может быть свойство NSMutableArray на вашем делетете. Каждый раз, когда вы используете addAnimation: forKey: добавьте этот CALayer в NSMutableArray. Затем вы можете ссылаться на все CALayers от вашего делегата. –

+0

Итак, вы имеете в виду, что * animationDidStop: finished: * должен сканировать этот измененный массив, чтобы увидеть, может ли он найти какие-либо объекты уровня, которые не имеют текущей анимации, а затем удалить их как из массива, так и из супер-слоя? – ragnarius

0

Смотрите, если этот ответ поможет: Perform an action after the animation has finished я нахожу animateWithDuration: анимация : завершение: быть более простым в использовании, чем работать непосредственно с CALayer. Вы можете связать несколько анимаций с помощью обработчика завершения, а затем удалить слой в последнем. например:

[UIView animateWithDuration:1.0 animations:^{ 
    // do first animation in the sequence 
} completion:^(BOOL finished) { 
    [UIView animateWithDuration:1.0 animations:^{ 
     // do second animation in the sequence 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:1.0 animations:^{ 
      // do third animation in the sequence 
     } completion:^(BOOL finished) { 
      // remove layer after all are done 
     }]; 
    }]; 
}]; 

Возможно немного грязный этот путь, но вы можете реорганизовать их в свои собственные вызовы методов, например.

+0

Я не уверен, как использовать * blocks * для анимации * объектов CALayer * (в ioS5 или 6). – ragnarius

0

Одно из решений Alternativ является добавление указателя уровня к словарю объекта анимации, поскольку следующим

// in some define section 
#define kAnimationRemoveLayer @"animationRemoveLayer" 

затем в animationDidStop,

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ 
    CALayer *lay = [theAnimation valueForKey:kAnimationRemoveLayer]; 
    if(lay){ 
     [lay removeAllAnimations]; 
     [lay removeFromSuperlayer]; 
    } 
} 

и, наконец, в анимации установка,

CALAyer * lay = ... ; 
BOOL shouldRemove = .... ; 
CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"position"]; 
anim.delegate = self; 
if (shouldRemove) 
    [anim setValue:lay forKey:kAnimationRemoveLayer]; 
Смежные вопросы