2009-09-21 2 views
5

Я добавляю некоторую базовую анимацию к карточной игре, над которой я работаю. (Мое первое приложение для iPhone.)Изменение вида контейнера анимации iPhone перед запуском анимации

Я создаю пользовательский класс UIView «AnimationContainer», который переворачивается с изображения1 на изображение2, переходя от rect1 к rect2. Мое конечное намерение состоит в том, чтобы до четырех из этих контейнеров выполняли свои переходы одновременно.

Проблема, с которой я сталкиваюсь, заключается в том, что анимация не показывает изображение1 ... поэтому появляется только последняя половина перехода с переворотом.

Однако, если я сначала сбрасываю анимацию, касаясь Сброса, тогда все работает отлично. Другими словами, если я снова и снова нажимаю Flip, я получаю только половину перехода ... но если я сначала нажимаю Reset, тогда все работает отлично для одного флип.

Итак, как я могу заставить анимацию правильно сбросить настройки?

Ниже приведен код, скриншот, и вот ссылка на письмо: Project Zip File 700k.

alt text http://www.robsteward.com/cardflip.jpg

- (void)displayWithImage1 {  //RESET button calls this 
    self.frame = rect1; 
    [image2 removeFromSuperview]; 
    [self addSubview:image1]; 
    [self setNeedsDisplay]; //no help: doesn't force an update before animation 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; //<---this is what the reset button calls 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

Спасибо!

+0

Я придумал полууглечный обходной путь. Я добавил «фиктивную» анимацию и сделал мой класс делегатом для своего setAnimationDidStopSelector. Манекен-анимация имеет продолжительность 0.0 и просто перемещает представление в rect1. Когда вызывается селектор остановки манекена, я делаю «настоящий» анимированный флип-код сверху. Полностью функциональный, и похоже, как минимум 4 может работать одновременно. Да, я. LOL – Rob

+1

Оказывается, что обходной путь может вызвать до половины секунды задержки, поэтому я начинаю щедрость. Должен быть способ отправить представление контейнера двум изображениям и перевести его с одного на другое на один переход. – Rob

ответ

12

Чтобы выполнить перерисовку представления перед выполнением анимации, вам понадобится контур рисования. Этот код является примером «рисовать это, и когда следующий цикл событий возникает, сделайте это другое». В UI-коде это не редкость. Ваша первая работа - попытка сделать то же самое, но гораздо сложнее.

- (void)_runTheAnimation { 
    // Moved here from -runTheAnimation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; 
    [self performSelector:@selector(_runTheAnimation) withObject:nil afterDelay:0.0]; 
} 
+1

Удивительный! Огромное спасибо. Я не совсем понял, что селектора не выполняли сразу. Сейчас все отлично работает. За 200 тысяч рублей было небольшая плата. Я потратил на это 10 часов. – Rob

+1

Селекторы отправляются немедленно, если их просят (-peformSelector :). Метод выше - -performSelector: withObject: afterDelay :, который планирует в runloop для селектора, который будет отправлен в какой-то момент в будущем. Задержка 0 эффективно означает «при следующем запуске цикла цикла». Селекторы сами описывают сообщение, передаваемое объекту. Акт передачи этого сообщения выполняется с помощью методов performSelector .... –

+1

Прохладный, я думаю, я понимаю. Все еще получая скорость на Cocoa, Objective-C и все вещи iPhone ... но сейчас я учусь быстрее. Еще раз спасибо. – Rob

Смежные вопросы