2010-06-14 2 views
0

Я сталкивался с некоторыми проблемами с анимацией нескольких CALayers одновременно и надеялся, что кто-то может указать мне в правильном направлении.CALayer: обратный вызов при завершении анимации?

Мое приложение содержит массив CALayer. Положение каждого слоя установлено на (previousLayer.position.y + previousLayer.bounds.height), что в основном выставляет их аналогично таблице. Затем у меня есть метод, который каждый раз, когда он вызывается, добавляет новый слой в стек и устанавливает его положение Y равным 0. Положения Y всех остальных слоев в массиве затем смещаются на высоту нового слой (по существу, нажав все старые слои вниз).

У меня возникают проблемы с предотвращением добавления новых слоев до тех пор, пока предыдущая анимация не завершится. Есть ли способ сказать, когда неявная анимация закончилась? Или, наоборот, если я использую CABasicAnimation и animationDidFinish, есть ли способ узнать, какой объект завершил анимацию, когда вызывается animationDidFinish?

ответ

0

Оказалось, что вместо добавления CABasicAnimation непосредственно к CALayer мне пришлось добавить его в словарь «действия» этого слоя ... Это оставляет слой в конечной позиции после окончания анимации, но все же вызывает 'animationDidFinish'.

-(void)startAnimation { 
    if(!animating){ 
     animating = YES; 
     for(int i=0; i<[tweets count]; i++) { 
      //get the layer 
      CETweetLayer *currentLayer = [tweets objectAtIndex:i]; 

      //setup the orgin and target y coordinates 
      float targetY = currentLayer.position.y + offset; 

     //setup the animation 
     CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; 
     anim.delegate = self; 
     currentLayer.actions = [NSDictionary dictionaryWithObject:anim forKey:@"position"]; 
     currentLayer.position = CGPointMake(self.bounds.size.width/2, targetY); 
    } 
    } 
} 

А потом ...

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
    animating = NO; 
} 
4

Вы можете установить произвольные значения для ключей вашего объекта анимации. Что это означает, что вы можете связать свой слой, который вы оживляющий с анимацией, а затем запросить его в -animationDidStop: закончил: Вы создаете вашу анимацию так:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; 
// set other fields... 

[anim setValue:layerToAnimate forKey:@"layer"]; 

// Start the animation 
[layerToAnimate addAnimation:anim forKey:nil]; 

Затем проверьте, что значение, когда анимация остановки:

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag 
{ 
    CALayer *animatedLayer = [animation valueForKey:@"layer"]; 
    // do something with the layer based on some condition... 
    // spin off the next animation... 

    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
       forKey:kCATransactionDisableActions]; 
    [animatedLayer setPosition:position]; 
    [CATransaction commit]; 
} 

Это явная анимация, но она должна дать вам то, что вам нужно.

+0

Это работало в основном. Код вызывается, и я могу вернуть объект слоя из ключа. Но я испытываю эффект мерцания, когда пытаюсь установить layer.position в положение, в котором слой должен находиться в конце анимации. Похоже, что анимация заканчивается, и позиция слоя возвращается в исходную позицию до того, как вызывается вызов 'layer.position ='. Любая идея, как я могу обойти это? – carloe

+0

Да. Если вы хотите установить свойство position в конце анимации, вам придется отключить неявную анимацию в транзакции в вашем -animationDidStop: finished: method. Я обновляю свой ответ с соответствующим кодом. –

+0

Код, который вы опубликовали, идентичен тому, что у меня был, и вызвал мерцание. Я просто понял, как обойти его и выведет код за секунду. Спасибо за вашу помощь! – carloe

1

Вы можете попробовать окружающим свой код в CATransaction. Вот как это будет выглядеть в Swift 3:

CATransaction.begin() 
CATransaction.setCompletionBlock({ 
    // run after the animations 
}) 
// animtations 
CATransaction.commit() 
+0

Это самое аккуратное решение здесь и работает очень хорошо. –

 Смежные вопросы

  • Нет связанных вопросов^_^