запуск CABasicAnimation последовательно - PullRequest
8 голосов
/ 17 октября 2011

Как я могу запустить одну CABasicAnimation после завершения работы другой? Другими словами, последовательно. Я добавил время начала второй анимации, однако кажется, что вторая анимация не выполняется:

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    appearance.duration = 0.5;
    appearance.fromValue = [NSNumber numberWithFloat:0];
    appearance.toValue = [NSNumber numberWithFloat:340];
    appearance.repeatCount = 1;
    appearance.fillMode = kCAFillModeForwards;
    appearance.removedOnCompletion = NO;
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"];



    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    theAnimation.duration = 0.5;
    theAnimation.fromValue = [NSNumber numberWithFloat:0];
    theAnimation.toValue = [NSNumber numberWithFloat:10];
    theAnimation.repeatCount = 3;
    theAnimation.autoreverses = YES;
    theAnimation.fillMode = kCAFillModeForwards;
    theAnimation.removedOnCompletion = NO;
    theAnimation.beginTime = appearance.beginTime + appearance.duration;
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"];

Есть идеи, почему?

Ответы [ 4 ]

15 голосов
/ 17 октября 2011

Обновлен код, это будет работать!

1-я анимация

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    [appearance setValue:@"animation1" forKey:@"id"];
    appearance.delegate = self;
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];
    appearance.duration = 0.5;
    appearance.fromValue = [NSNumber numberWithFloat:0];
    appearance.toValue = [NSNumber numberWithFloat:340];
    appearance.repeatCount = 1;
    appearance.fillMode = kCAFillModeForwards;
    appearance.removedOnCompletion = NO;
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"];

2-я анимация:

    - (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag {
    if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) {
    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    theAnimation.duration = 0.5;
    theAnimation.fromValue = [NSNumber numberWithFloat:0];
    theAnimation.toValue = [NSNumber numberWithFloat:10];
    theAnimation.repeatCount = 3;
    theAnimation.autoreverses = YES;
    theAnimation.fillMode = kCAFillModeForwards;
    theAnimation.removedOnCompletion = NO;
    theAnimation.beginTime = appearance.beginTime + appearance.duration;
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"];
}

}

Так будет срабатывать вторая анимация после ее завершения.

1 голос
/ 17 октября 2011

Причина, по которой ваша анимация не работает в соответствии с планом, связана с тем, как вы кодировали и использовали Core Animation.Все основные анимации работают на GPU.CA infact отлично справляется с несколькими задачами для оптимальной визуализации анимации.

Одним из элементов этого является необработанная мощь параллельной обработки современных видеокарт, а другим является тот факт, что Core Animation может кэшировать содержимое CALayer накарта, так что ваш код не должен постоянно перерисовывать ее.Это, кстати, одна из причин, почему пользовательский интерфейс iPhone невероятно быстр на некотором относительно скромном оборудовании.Core Animation может автоматически использовать преимущества многоядерного Mac, потому что дерево слоев отображается в отдельном потоке .

Последняя строка - imp.Центры сертификации работают в отдельном потоке (а не в основном потоке).Итак, возвращаясь к вашей проблеме, у вас есть 2 блока CA, каждый из которых пытается анимировать один и тот же transform.translation.y Оба одновременно!Как бы это работало?

Чтобы решить эту проблему, либо выполните -

  1. Что-то, что кто-то предложил, поместите задержку для второй анимации, чтобы после первой анимации, только второй пиналпосле того, как первая ОС закончилась.
  2. или попробуйте сделать всю анимацию в одном блоке (опять же, как кто-то предложил).

Я просто хотел выделить теорию и обоснование того, как работает Core Animation.Надеюсь, это поможет ...

1 голос
/ 17 октября 2011

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

0 голосов
/ 18 июня 2013

Самый простой и чистый способ - использовать CAAnimationGroup. Посмотрите на этот ответ - он помог мне.

Цепочка анимации анимации ядра

...