Я знаю, что вы сказали, что используете CAKeyframeAnimations, но если вам нужна простая анимация свойств UIView (origin, bounds, alpha и т. Д.), Вы можете обернуть изменение свойства или свойств в begin / commit заблокировать и указать метод делегата, который вызывается после завершения анимации. Пока метод делегата принимает три аргумента, вы можете вызывать его как хотите. Например:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(yourAnimationHasFinished:finished:context:)];
// Change property or properties here
[UIView commitAnimations];
вызовет метод
- (void)yourAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;
подлежит вызову. Произвольное именование, которое это позволяет, предоставило бы вам средство разделения обработки для завершения различных анимаций. Я предпочитаю это для простых анимаций.
Для работы с более сложными анимациями, которые напрямую взаимодействуют с CALayers, метод animationDidStop: закончен: делегат возвращает завершенный объект анимации. Если вы создаете один экземпляр, который является делегатом для нескольких анимаций, вы можете создать NSMutableDictionary для анимаций и NSNumbers для использования в операторе switch в animationDidStop: finish: method. Когда вы создаете CAKeyframeAnimation, используйте setObject: forKey: чтобы присвоить его соответствующему номеру, затем используйте objectForKey: найти число, соответствующее этой анимации, в методе завершения и введите его в оператор switch.