2014-12-22 3 views
0

У меня есть массив CAShapeLayer. В какой-то момент я должен перебирать этот массив и запускать анимацию для каждого слоя. Эти анимации меняют bounds.size.height слоев на разные значения (вычисленные каким-то образом). В методе animationDidStop я бы хотел изменить высоту каждого слоя на значение animation.toValue. Мне нужно сделать это, потому что я хочу, чтобы будущие анимации начинались с новых значений, а не из начальных значений. Это цикл:Как идентифицировать CAShapeLayer в анимацииDidStop

for (int i=0; i<[layersArray count]; i++) { 
    newLayerHeight = [self computeNewHeightForLayer:[layersArray objectAtIndex:i]; 

    CABasicAnimation *myAnim = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"]; 
    myAnim.delegate = self; 
    myAnim.duration = 0.4; 
    myAnim.removedOnCompletion = NO; 
    myAnim.fillMode = kCAFillModeForwards; 
    myAnim.fromValue = [NSNumber numberWithFloat:[layersArray objectAtIndex:i]).bounds.size.height]; 
    myAnim.toValue = [NSNumber numberWithFloat:newLayerHeight]; 
    [[layersArray objectAtIndex:i] addAnimation:myAnim forKey:@"changeHeightAnim"]; 
} 

В animationDidStop метод, который я хотел бы сделать что-то вроде этого (что эквивалентно этому, на самом деле, а если-иначе парадигма не лучший):

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 
    if(flag){ 
     /* 
      if(anim is linked to layer0)change the height of layer0; 
      if(anim is linked to layer1)change the height of layer1; 
      . 
      . 
      . 
      if(anim is linked to layerN-1)change the height of layerN-1; 

     */ 
    } 
} 

Есть идеи? Спасибо.

ответ

2

Дайте определенное значение для каждой анимации вы установили для каждого CAShapeLayer, как вы цикл через массив слоев, например, так:

[myAnim setValue:@"layer_1" forKey:@"animation_id"]; 
[myAnim setValue:@"layer_2" forKey:@"animation_id"]; 
... 

В вашем методе «animationDidStop», проверьте значение параметра анимации для , так:

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 
    if([[anim valueForKey:@"animation_id"] isEqual:@"layer_1"]) { 
     // do something 
    } 
    else if([[anim valueForKey:@"animation_id"] isEqual:@"layer_2"]) { 
     // do something 
    } 
} 
+0

Спасибо. Я принял немного другое решение, но ядро ​​этого решения принадлежит вам. – superpuccio

+0

Прохладный @superpuccio, удачи :) – YoCoh

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