Как идентифицировать CAShapeLayer в animationDidStop

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

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 я хотел бы сделать что-то вроде этого (на самом деле эквивалент этого; парадигма if-else не самая лучшая):

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

        */
    }
}

Любая идея? Спасибо.


person matteopuc    schedule 22.12.2014    source источник


Ответы (1)


Укажите конкретное значение для каждой анимации, которую вы установили для каждого 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
    }
}
person cohen72    schedule 22.12.2014
comment
Спасибо. Я принял немного другое решение, но его ядро ​​принадлежит вам. - person matteopuc; 22.12.2014