Перевод старого анимационного кода в новую технику iOS4 - PullRequest
1 голос
/ 08 июля 2011

Я пытаюсь освоить анимацию с книгой 2009 года, и, насколько я понимаю, предпочтительным методом анимации в iOS4 является использование блоков. Книга, которую я читаю, использует старый метод, и я пытался перевести его на новый метод с минимальным успехом.

Что говорится в книге:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationTimer];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDidStopSelector:@selector(lastAnimationZero)];

//animations

[UIView commitAnimations];

Мой (очевидно, неудачный) перевод:

[UIView animateWithDuration:animationTimer
                    options: (UIViewAnimationOptionAllowUserInteraction | 
                              UIViewAnimationOptionCurveEaseOut)
                 animations: ^
                 {
                     animation
                 }
                 completion:^(BOOL finished)
                 {
                     lastAnimation = 0;
                 }];

Каждый раз, когда я запускаю его, я (используя блочный метод) получаю «Программа получила сигнал:« SIGABRT »и консоль показывает

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+    
[UIView animateWithDuration:options:animations:completion:]: unrecognized selector sent to class 0x8393b4'

1 Ответ

2 голосов
/ 08 июля 2011

Проверьте документ на UIVIew . Там нет такого метода. То, как вы написали синтаксис блока в порядке, просто отправьте правильное сообщение.

Кроме того, замените 'animation' необходимыми инструкциями, книга не скажет вам, что, как и [UIView setAnimationDidStopSelector: @selector(lastAnimationZero)]; в старой версии, на самом деле это сообщение, отправленное после остановки анимации, и не должно напрямую переведено на lastAnimation = 0;.

Вот ссылка на документацию метода, которую вы, вероятно, хотели использовать.

+(void)animateWithDuration:(NSTimeInterval)duration
                     delay:(NSTimeInterval)delay
                   options:(UIViewAnimationOptions)options
                animations:(void (^)(void))animations
                completion:(void (^)(BOOL finished))completion;
...