Мне нужна помощь с обратными вызовами анимации (iPhone) - PullRequest
6 голосов
/ 03 января 2009

Я создаю приложение в iPhone, и у меня есть несколько UIViews и слоев в нем. Я делаю некоторые анимации с использованием класса CAKeyframeAnimation, и поскольку анимации должны быть связаны цепочкой, я переопределил метод animationDidStop в UIView.

Я получаю обратные вызовы должным образом, однако я просто не мог понять, как я могу найти, какая анимация была закончена, чтобы я мог запустить следующую. Только параметры для функции обратного вызова - это объект CAAnimation и логическое значение.

Я могу обойти эту проблему, установив свойство в классе и используя enum для различных анимаций, которые я использую. Однако я просто хотел узнать, есть ли какие-либо встроенные атрибуты в обратных вызовах, которые я могу установить в объекте CAKeyframeAnimation, а затем сослаться на это в обратном вызове.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

13 голосов
/ 03 января 2009

Вы можете указать имя для анимации и прочитать его в методе делегата.

[animation setValue:"firstAnimation" forKey:@"name"];

...

- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished {
  if([[animation valueForKey:@"name"] isEqual:@"firstAnimation"] && finished) {
    ...
  }
}
11 голосов
/ 03 января 2009

Я знаю, что вы сказали, что используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...