Как указал Мэтт, вы можете создавать анимационные группы, которые состоят из разных анимаций для одного и того же слоя с разным временем начала. Вы также можете установить делегат для отдельных CAAnimation
объектов или CAAnimation
групп, и по окончании каждой анимации будет вызываться метод делегата animationDidStop:finished:
(обратите внимание, что анимации, являющиеся частью группы, не будут вызывать * делегата их animationDidStop:finished:
метод.
Я выяснил классный трюк, который делает использование метода CAAnimation animationDidStop:finished:
более мощным. Я использую метод setValue:forKey:
для добавления блока кода в отдельную анимацию или группу анимации с помощью клавиши @ "animationCompletionBlock". Затем я пишу общий animationDidStop:finished:
метод, который проверяет только что завершенную анимацию для ключа @ "animationCompletionBlock" и, если он ее находит, выполняет там блок кода.
Взгляните на этот проект на github для рабочего примера этой техники:
Демонстрация CAAnimation с блоками завершения
Вы также можете установить группу анимаций внутри
[CATransaction begin];
//...
[[CATransaction commit];
блок, как вы предложили. Когда вы сделаете это, вы можете использовать CATransaction
метод класса setCompletionBlock:
для вызова блока кода, когда все анимации в текущей группе транзакций завершены. Блок завершения для одной транзакции может затем вызвать следующую транзакцию.