объединить несколько CAAnimation последовательно - PullRequest
1 голос
/ 12 февраля 2011

Я читал о CATransactions, а затем подумал, что это может помочь решить мою проблему.

Это то, что я не хочу делать: у меня есть 3 анимации в одном слое, каждый из которых имеет свою продолжительность.Я создаю анимацию, используя CAKeyframeAnimation с CGMutablePathRef.

скажем, например:

  • anim1 -> длительность 5 с
  • anim2 -> 3 с
  • anim3 -> 10 с

Теперь я хочу последовательно их сериализовать.Я пытался использовать CAAnimationGroup, но анимация запускается одновременно.Я читал о CATransaction, это возможное решение?Можете привести небольшой пример?

спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Если под сериализацией вы подразумеваете запуск каждой анимации после завершения предыдущей, используйте свойство beginTime (определено в протоколе CAMediaTiming).Обратите внимание, что его документация немного вводит в заблуждение.Вот пример:

anim2.beginTime = anim1.beginTime + anim1.duration;
anim3.beginTime = anim2.beginTime + anim2.duration;
0 голосов
/ 11 апреля 2014

Если вы уверены, что делаете это со слоями, то вы можете попробовать, как следует

Использование блока завершения в транзакциях CAT

-(void)animateThreeAnimationsOnLayer:(CALayer*)layer animation:(CABasicAnimation*)firstOne animation:(CABasicAnimation*)secondOne animation:(CABasicAnimation*)thirdOne{
    [CATransaction begin];

        [CATransaction setCompletionBlock:^{
            [CATransaction begin];

            [CATransaction setCompletionBlock:^{
                [CATransaction begin];

                [CATransaction setCompletionBlock:^{
                    //If any thing on completion of all animations
                }];
                [layer addAnimation:thirdOne forKey:@"thirdAnimation"];
                [CATransaction commit];
            }];
            [layer addAnimation:secondOne forKey:@"secondAnimation"];
            [CATransaction commit];
        }];
    [layer addAnimation:firstOne forKey:@"firstAnimation"];
    [CATransaction commit];

}

Другой способ - применить задержку для начала анимации.

-(void)animateThreeAnimation:(CALayer*)layer animation:(CABasicAnimation*)firstOne animation:(CABasicAnimation*)secondOne animation:(CABasicAnimation*)thirdOne{
    firstOne.beginTime=0.0;
    secondOne.beginTime=firstOne.duration;
    thirdOne.beginTime=firstOne.duration+secondOne.duration;

    [layer addAnimation:firstOne forKey:@"firstAnim"];
    [layer addAnimation:secondOne forKey:@"secondAnim"];
    [layer addAnimation:thirdOne forKey:@"thirdAnim"];
}

А если Вы собираетесь использовать UIVIew Animation

//if View is applicable in your requirement then you can look this one;
-(void)animateThreeAnimationOnView{
    [UIView animateWithDuration:2.0 animations:^{
        //first Animation
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:2.0 animations:^{
            //Second Animation
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:2.0 animations:^{
                //Third Animation
            }];
        }];
    }]; 

}

...