несколько CAKeyframeAnimation в разных слоях одновременно - PullRequest
5 голосов
/ 09 декабря 2010

Кто-нибудь теперь, как я могу анимировать несколько слоев одновременно с помощью CAKeyframeAnimation? Каждый слой имеет свой собственный объект CAKeyframeAnimation. Посмотрите на код ниже:

У меня есть метод, который получает объект, создает CAKeyframeAnimation и присоединяет к нему анимацию:

- (void)animateMovingObject:(CALayer*)obj
               fromPosition:(CGPoint)startPosition
                 toPosition:(CGPoint)endPosition
                   duration:(NSTimeInterval)duration {
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.calculationMode = kCAAnimationPaced;
    //pathAnimation.fillMode = kkCAFillModeRemoved; // default 
    //pathAnimation.removedOnCompletion = YES; // default
    pathAnimation.duration = duration;

    // create an empty mutable path
    CGMutablePathRef curvedPath = CGPathCreateMutable();

    // set the starting point of the path
    CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y);

    CGPathAddCurveToPoint(curvedPath, NULL, 
                          startPosition.x, endPosition.y, 
                          startPosition.x, endPosition.y,
                          endPosition.x, endPosition.y);
    pathAnimation.path = curvedPath;
    [obj addAnimation:pathAnimation forKey:@"pathAnimation"];
    CGPathRelease(curvedPath);
}

Теперь предположим, что в моей настольной игре добавлено 3 слоя в качестве подслоя, и я делаю следующие вызовы:

CALayer obj1 = ... // set up layer and add as sublayer
[self animateMovingObject:obj1
             fromPosition:CGPointMake(0.0, 0.0)
               toPosition:CGPointMake(100.0, 100.0)
                 duration:2.0];

CALayer obj2 = ... // set up layer and add as sublayer
[self animateMovingObject:obj2
             fromPosition:CGPointMake(0.0, 0.0)
               toPosition:CGPointMake(150.0, 100.0)
                 duration:2.0];

CALayer obj3 = ... // set up layer and add as sublayer
[self animateMovingObject:obj3
             fromPosition:CGPointMake(0.0, 0.0)
               toPosition:CGPointMake(200.0, 100.0)
                 duration:2.0];

При этом я вижу только перемещение obj3 из положения (0.0, 0.0) в (200.0, 100.0). Что мне не хватает? Должен ли я использовать NSOperationQueue / Threads? Использование animationDidStart: метода делегата CAKeyframeAnimation, кажется, не является полезным в этом контексте.

Есть идеи?

Заранее спасибо.

1 Ответ

4 голосов
/ 09 декабря 2010

Если вы хотите сгруппировать серию подобных анимаций, чтобы гарантировать их синхронизацию, вы можете заключить их в транзакцию CAT:

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];     

// Do animations

[CATransaction commit];     

Однако я не совсем уверен, почемукод, который вы написали, не запускает правильную анимацию для каждого слоя, даже если они не были синхронизированы.

Обратите внимание, что при установке removedOnCompletion на YES ваша анимация будет запущена, а затем объектвернемся к своей начальной точке в конце.Вы, вероятно, хотите, чтобы это было НЕТ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...