Как отменить анимацию на основе блоков UIViews?
i в настоящее время сосредоточена следующая проблема:
i запустите анимацию, в которой запускаются 2 объекта-атрибута.
код:
[UIView animateWithDuration:0.3 animations:^{
greyscaleImage.alpha = 1;
activityIndicator.alpha = 1;
} completion:^(BOOL f){
if(f)
{
[activityIndicator startAnimating];
}
}];
который отлично работает.
Единственная проблема, которую я обнаружил, заключается в том, что у меня есть 0,3 секунды, чтобы свернуть приложение, когда вид, который удерживает этот ActivityIndicator и greyscaleImage, освобождается.
Чтобы сделать его более понятным, представьте себе ViewController, его представление представлено с помощью способов IOS-модального просмотра по умолчанию. Теперь запускаем эту анимацию, которая занимает 2 минуты. до достижения этих 2 минут вы обнаружите, что анимация довольно скучна, и вы хотите отклонить эту точку зрения. теперь, когда вызывается представление, activityIndicator и greyscaleImage, анимация o/c не может знать, что делать.
поэтому мне интересно, что здесь делать + почему отладчик указывает на
} completion:^(BOOL f){
вместо, например, [activityIndicator...
Есть ли способ, позволяющий пользователю отклонить представление до истечения 2 минут?
С наилучшими пожеланиями
Ответы
Ответ 1
Если вы запустите новую анимацию, которая занимает 0.0 секунд и переходит в состояние, в которое вы хотите перейти, она отменяет старую и запускает новую (мгновенную) анимацию.
Пример, когда вы хотите остановить перемещение, перейдя к тому месту, где он уже находится:
[UIView animateWithDuration:0.0
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
completion:^(BOOL finished){}
];
параметры: UIViewAnimationOptionBeginFromCurrentState важен. Не вызывая его, вы сможете начать анимацию в конце предыдущей анимации. В движении он будет деформироваться до конечного местоположения до деформирования до того места, где вы хотите его остановить. Даже несмотря на то, что ваше отмененное "мгновение" мгновенно, прыжки назад и вперед могут быть видимыми.
Примечание. Время анимации не должно быть 0.0 секунд, любая анимация отменяет старую. Однако не совсем уверен в различных типах анимаций. Например, я не знаю, прекратит ли изменение рамки фрейм.
Ответ 2
Вы можете удалить все анимации из уровня просмотров
[movingView.layer removeAllAnimations];
Ответ 3
Блоки всегда будут завершаться после их запуска и не могут быть остановлены (если вы не отключите приложение). Возможно, вы захотите использовать центр уведомлений или NSTimer для ручной смены кадров.
Ответ 4
Настройка параметров анимации UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
работает для меня.
Используйте его следующим образом:
[UIView animateWithDuration:0.5
delay:0.0
usingSpringWithDamping:0.7
initialSpringVelocity:0
options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
// Do your stuff here, like changing the frame etc.
self.containerView.frame = CGRectMake(0, 100, 300, 300);
} completion:nil];