Подтвердить что ты не робот

Остановка анимации UIView с автоматической реверсией/бесконечным повторением с блоком BOOL/завершения

Я настраиваю следующий метод UIView animateWithDuration: с намерением установить мой animationOn BOOL в другом месте программы, чтобы отменить это бесконечное циклическое повторение. У меня создалось впечатление, что блок completion будет вызываться каждый раз, когда цикл анимации заканчивается, но это, похоже, не так.

Является ли блок completion когда-либо вызываемым в повторяющейся анимации? А если нет, есть ли другой способ остановить эту анимацию вне этого метода?

- (void) animateFirst: (UIButton *) button
{
    button.transform = CGAffineTransformMakeScale(1.1, 1.1);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){
                         if (!animationOn) {
                             [UIView setAnimationRepeatCount: 0];
                         }
    }];
}
4b9b3361

Ответ 1

Блок завершения будет вызван только тогда, когда анимация будет прервана. Например, он вызывается, когда приложение идет в фоновом режиме и снова возвращается на передний план (через многозадачность). В этом случае анимация останавливается. Вы должны перезапустить анимацию, когда это произойдет.

Чтобы остановить анимацию, вы можете удалить ее из слоя вида:

[button.layer removeAllAnimations];

Ответ 2

Старый, но другой вариант.

Вы также можете настроить еще одну анимацию, которая не повторяется на одном и том же представлении, таким образом вы можете также захватить ее в текущем состоянии и вернуть ее к тому, как это происходит, используя параметр UIViewAnimationOptionBeginFromCurrentState. Также вызывается блок завершения.

-(void)someEventSoStop
{
    button.transform = CGAffineTransformMakeScale(1.0, 1.0);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){

                     }];
}

Ответ 3

Я решил проблему, вызвав [button.layer removeAllAnimations].

Ответ 4

В соответствии с документацией для ссылки класса View: если вы использовали какой-либо из методов класса, таких как animateWithDuration:delay:options:animations:completion: если длительность установлена ​​на отрицательное значение или 0, изменения производятся без выполнения анимации. поэтому я сделал что-то вроде этого, чтобы остановить бесконечную анимацию:

[UIView animateWithDuration:0.0 animations:^{
      button.layer.affineTransform = CGAffineTransformIdentity;
  }];

Я думаю, что это лучше, чем удаление всех анимаций со слоя, как в предлагаемом ответе. Обратите внимание, что это применимо для всех других методов анимации класса в классе UIView.