Изменение представления контейнера анимации iPhone перед запуском анимации
Я добавляю базовую анимацию в карточную игру, над которой я работаю. (Мое первое приложение для iPhone.)
Я создаю пользовательский класс UIView "AnimationContainer", который переворачивается с image1 на image2 при переходе от rect1 к rect2. Мое конечное намерение состоит в том, чтобы до четырех из этих контейнеров выполняли свои переходы одновременно.
У меня проблема в том, что анимация не показывает изображение1... поэтому появляется только последняя половина флип-перехода.
Однако, если я сначала сброшу анимацию, коснувшись "Сбросить", то все будет работать отлично. Другими словами, если я нажимаю Flip снова и снова, я получаю только половину перехода... но если я сначала нажимаю Reset, то все работает идеально для одного щелчка.
Итак, как я могу получить анимацию, чтобы сбросить себя правильно?
Ниже приведен код, снимок экрана и вот ссылка на полный текст: Project Zip File 700k.
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];
}
Спасибо!
1 ответ
Вам нужно пройти цикл рисования, чтобы перерисовать вид перед выполнением анимации. Этот код является примером "нарисуйте это, и когда появится следующий цикл обработки событий, сделайте эту другую вещь". Это не редкость сделать в коде пользовательского интерфейса. Ваш первый обходной путь - попытка сделать то же самое, но гораздо более сложным способом.
- (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];
}