Я начинаю учиться использовать анимацию UIView. Таким образом, я записал следующие строки:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2.0];
[UIView setAnimationRepeatCount:2];
[UIView setAnimationRepeatAutoreverses:YES];
CGPoint position = greenView.center;
position.y = position.y + 100.0f;
position.x = position.x + 100.0f;
greenView.center = position;
[UIView commitAnimations];
В этом случае UIView (зеленое поле) попятился и нос 2 раза. Пока неплохо, НО я узнал, что после перемещения дважды, зеленое поле закончилось, перешел к "новой позиции" (position.x + 100.0f, position.y + 100.0f) вместо того, чтобы возвращаться к исходному положению (position.x, position.y). Это заставляет анимацию выглядеть довольно нечетной (как после колебания поля назад к исходному положению, вызванному setAnimationRepeatAutoreverses, это переходит назад к новой позиции в прошлую микросекунду!)
Что лучший способ состоит в том, чтобы заставить зеленое поле NOT перейти к новой позиции в самую последнюю минуту?
У меня была точно такая же проблема с использованием анимации UIView в свойстве alpha. Хуже всего то, что анимация перескакивает в "конечную" позицию перед отправкой сообщения animationDidStop: delegate, что означает, что вы не можете вручную установить исходное состояние там.
Мое решение состояло в том, чтобы использовать сообщения делегата animationDidStop для создания нового блока анимации и связать их все вместе:
- (void)performAnimation
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(phase1AnimationDidStop:finished:context:)];
// Do phase 1 of your animations here
CGPoint center = someView.center;
center.x += 100.0;
center.y += 100.0;
someView.center = center;
[UIView commitAnimations];
}
- (void)phase1AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(phase2AnimationDidStop:finished:context:)];
// Do phase 2 of your animations here
CGPoint center = someView.center;
center.x -= 100.0;
center.y -= 100.0;
someView.center = center;
[UIView commitAnimations];
}
- (void)phase2AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
// Perform cleanup (if necessary)
}
Таким образом вы можете связать вместе столько блоков анимации, сколько захотите. Это кажется расточительным с точки зрения кода, но пока Apple не предоставит нам свойство - [UIView setAnimationFinishesInOriginalState:] или что-то подобное, это единственный способ, который я нашел для решения этой проблемы.