Объединить несколько CAAnimation последовательно
Я читал о CATransactions, а затем подумал, что это может помочь решить мою проблему.
Это то, что я не хочу делать: у меня есть 3 анимации в одном слое, каждый из которых имеет свою продолжительность. Я создаю анимацию, используя CAKeyframeAnimation с CGMutablePathRef.
скажем, например:
- anim1 -> продолжительность 5 с
- anim2 -> 3с
- anim3 -> 10 с
Теперь я хочу сериализовать их последовательно. Я пытался использовать CAAnimationGroup, но анимация запускается одновременно. Я читал о CATransaction, это возможное решение? Можете ли вы дать мне маленький пример?
Спасибо за помощь!
2 ответа
Если под сериализацией вы подразумеваете запуск каждой анимации после завершения предыдущей, используйте beginTime
свойство (определено в CAMediaTiming
Протокол). Обратите внимание, что его документация немного вводит в заблуждение. Вот пример:
anim2.beginTime = anim1.beginTime + anim1.duration;
anim3.beginTime = anim2.beginTime + anim2.duration;
Если вы уверены, что сделаете это со слоями, вы можете попробовать следующее
Использование блока завершения в транзакциях 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
}];
}];
}];
}