setAnimationRepeatAutoreverses не вел себя, как я ожидал

Я начинаю учиться использовать анимацию 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 перейти к новой позиции в самую последнюю минуту?

5
задан Andy Obusek 30 December 2012 в 18:34
поделиться

1 ответ

У меня была точно такая же проблема с использованием анимации 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:] или что-то подобное, это единственный способ, который я нашел для решения этой проблемы.

1
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: