Можно ли отменить UIView
анимацию во время ее выполнения? Или мне придется опуститься до уровня CA?
то есть я сделал что-то вроде этого (может быть, тоже установил действие окончания анимации)
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties
// set view properties
[UIView commitAnimations];
Но прежде чем анимация завершится, и я получу событие завершения анимации, я хочу отменить его (сократить его). Это возможно? В поисках гугла находят несколько человек, задающих один и тот же вопрос без ответов - и один или два человека гадают, что это невозможно.
ios
core-animation
uiviewanimation
philsquared
источник
источник
Ответы:
Я делаю это, чтобы создать новую анимацию для вашей конечной точки. Установите очень короткую продолжительность и убедитесь, что вы используете
+setAnimationBeginsFromCurrentState:
метод, чтобы начать с текущего состояния. Когда вы устанавливаете его в YES, текущая анимация обрывается. Выглядит примерно так:источник
setAnimationBeginsFromCurrentState:
iOS 4 не рекомендуется, но оно все еще есть и должно функционировать.Использование:
источник
Простейший способ немедленно остановить все анимации в определенном виде :
Свяжите проект с QuartzCore.framework. В начале вашего кода:
Теперь, когда вы хотите остановить все анимации на представлении, мертвом в своих треках, скажите это:
Средняя линия будет работать сама по себе, но есть задержка, пока не закончится runloop («момент перерисовки»). Чтобы предотвратить эту задержку, оберните команду в явный блок транзакции, как показано. Это работает при условии, что в текущем цикле выполнения не было никаких других изменений на этом слое.
источник
removeAllAnimations
будет иметь побочный эффект от переноса анимации до ее окончательного кадра, вместо того, чтобы останавливать ее там, где она находится сейчас.На iOS 4 и выше используйте
UIViewAnimationOptionBeginFromCurrentState
опцию для второй анимации, чтобы сократить первую анимацию.В качестве примера предположим, что у вас есть представление с индикатором активности. Вы хотите добавить индикатор активности в то время, когда начинается какое-то потенциально трудоемкое действие, и уменьшить его, когда действие закончено. В приведенном ниже коде вызывается представление с индикатором активности
activityView
.источник
Чтобы отменить анимацию, вам просто нужно установить свойство, которое в данный момент анимируется, вне анимации UIView. Это остановит анимацию, где бы она ни находилась, и UIView перейдет к настройке, которую вы только что определили.
источник
-animationDidStop:finished:context:
. Если[finished boolValue] == NO
, тогда вы знаете, что ваша анимация была как-то отменена.Извините, что воскресил этот ответ, но в iOS 10 все изменилось, и теперь отмена возможна, и вы даже можете отменить изящно!
После iOS 10 вы можете отменить анимацию с UIViewPropertyAnimator !
Если вы передадите true, анимация будет отменена и остановится там, где вы ее отменили. Метод завершения не будет вызван. Однако, если вы передадите false, вы несете ответственность за завершение анимации:
Вы можете закончить анимацию и оставаться в текущем состоянии (.current) или перейти в исходное состояние (.start) или в конечное состояние (.end)
Кстати, вы можете даже приостановить и перезагрузить позже ...
Примечание. Если вы не хотите внезапного отмены, вы можете изменить анимацию или даже изменить анимацию после ее приостановки!
источник
Если вы анимируете ограничение, изменяя константу вместо свойства представления, ни один из других методов не работает на iOS 8.
Пример анимации:
Решение:
Вам необходимо удалить анимацию из слоев любых видов, на которые влияет изменение ограничения, и их подслоев.
источник
self.constraintView.layer.removeAllAnimations()
работает только (Swift)Если вы просто хотите плавно приостановить / остановить анимацию
Источник: Как приостановить анимацию дерева слоев
источник
Ничто из вышеперечисленного не решило это для меня, но это помогло:
UIView
анимация сразу устанавливает свойство, а затем анимирует его. Останавливает анимацию, когда уровень представления соответствует модели (свойство set).Я решил свою проблему, которая была «Я хочу анимировать, откуда вы выглядите, как вы выглядите» («вы» означает вид). Если вы хотите ЭТО, то:
CALayer * pLayer = theView.layer.presentationLayer;
установить положение на уровне представления
Я использую несколько вариантов, включая
UIViewAnimationOptionOverrideInheritedDuration
Но поскольку документация Apple нечеткая, я не знаю, действительно ли она перекрывает другие анимации при использовании или просто сбрасывает таймеры.
И это должно быть достойным решением на данный момент.
источник
источник
Быстрая версия решения Стивена Дарлингтона
источник
У меня та же проблема; API не имеют ничего, чтобы отменить какую-то конкретную анимацию.
+ (void)setAnimationsEnabled:(BOOL)enabled
отключает ВСЕ анимации, и, следовательно, не работает для меня. Есть два решения:
1) сделать анимированный объект подпредставлением. Затем, когда вы хотите отменить анимацию для этого вида, удалите вид или скройте его. Очень просто, но вам нужно воссоздать подпредставление без анимации, если вам нужно держать его в поле зрения.
2) Повторите аним только один, и сделайте селектор делегата, чтобы перезапустить аним, если это необходимо, например:
Проблема с 2) заключается в том, что при остановке анимации всегда задерживается остановка анимации.
Надеюсь это поможет.
источник
Даже если вы отмените анимацию указанными выше способами, она
didStopSelector
все равно запускается. Так что если в вашем приложении есть логические состояния, управляемые анимацией, у вас будут проблемы. По этой причине описанными выше способами я использую переменную контекстаUIView
анимации. Если вы передаете текущее состояние вашей программы через контекстный параметр анимации, когда анимация останавливается, вашаdidStopSelector
функция может решить, должна ли она что-то делать или просто вернуться, основываясь на текущем состоянии и значении состояния, переданном в качестве контекста.источник
источник
Чтобы приостановить анимацию, не возвращая состояние в исходное или окончательное состояние:
источник
Когда я работаю с
UIStackView
анимацией, кроме того,removeAllAnimations()
мне нужно установить некоторые значения в исходное, потому чтоremoveAllAnimations()
можно установить их в непредсказуемое состояние. У меня естьstackView
сview1
иview2
внутри, и один вид должен быть виден, а другой скрыт:источник
Ни одно из ответов не сработало для меня. Я решил свои проблемы таким образом (я не знаю, является ли это правильным способом?), Потому что у меня были проблемы при вызове этого слишком быстро (когда предыдущая анимация еще не была закончена). Я передаю желаемую анимацию с помощью блока customAnim .
источник