Остановка анимации 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];
}
}];
}
Ответы
Ответ 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.