Проверьте, находится ли UIView в середине анимации - PullRequest
45 голосов
/ 03 апреля 2011

Есть ли способ узнать, находится ли UIView в середине анимации? Когда я распечатываю объект просмотра во время его движения, я замечаю, что есть запись «анимации»:

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; animations = { position=<CABasicAnimation: 0x6a69c40>; bounds=<CABasicAnimation: 0x6a6d4d0>; }; layer = <CALayer: 0x2e6e00>>

Когда анимация остановилась и я распечатал вид, запись "анимации" исчезла:

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; layer = <CALayer: 0x2e6e00>>

Ответы [ 9 ]

39 голосов
/ 03 апреля 2011

UIView имеет слой ( CALayer ). Вы можете отправить ему animationKeys , который даст вам массив ключей, которые идентифицируют анимацию, прикрепленную к слою. Я предполагаю, что если есть какие-либо записи, анимация (ы) работает. Если вы хотите копать еще глубже, взгляните на протокол CAMediaTiming , который принимает CALayer. Он делает еще немного информации о текущей анимации.

25 голосов
/ 03 апреля 2011

Анимации фактически привязаны к базовой Core Animation CALayer class

Так что я думаю, что вы можете просто проверить myView.layer.animationKeys

9 голосов
/ 26 января 2018

Метод iOS 9+ , работает, даже если layer.animationKeys не содержит ключей:

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0

Из документов:

Этот метод возвращает тольконенулевое значение, если вызывается в анимационном блоке UIView.

8 голосов
/ 21 мая 2012

Я не уверен в контексте вопроса, но я пытался выяснить, анимировалось ли представление, прежде чем запускать вторую анимацию, чтобы избежать пропуска. Однако есть опция анимации UIView UIViewAnimationOptionBeginFromCurrentState, которая при необходимости объединит анимацию, чтобы придать ей плавный вид. Тем самым устраняется моя необходимость знать, был ли вид анимирован.

5 голосов
/ 20 февраля 2012

Есть хитрость с трюком animationKeys.

Иногда может быть несколько анимационных клавиш, задерживающихся после завершения анимации.

Это означает, что слой без анимации может возвращать набор animationKeys, даже если он на самом деле не анимируется.

Вы можете убедиться, что animationKeys автоматически удаляются, установив для свойства анимации removeOnCompletion значение YES.

, например

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"aPath"];
animation.removedOnCompletion = YES;

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

3 голосов
/ 21 августа 2015

Некоторые из них не работают для меня. Причина в том, что эти анимации асинхронные.

То, что я сделал, определило свойство

@property BOOL viewIsAnimating;

А в моей анимации

[UIView animateWithDuration:0.25
                 animations:^{
                     viewIsAnimating = YES;
                 } completion:^(BOOL finished) {
                     if (finished) {
                         viewIsAnimating = NO;
                     }
                 }];
1 голос
/ 24 мая 2019

Вы можете использовать свойство layer UIView.CALayer имеет свойство, называемое ключами анимации, его количество можно проверить, если оно больше 0.

if (view.layer.animationKeys.count) {

  // Animating

}else {

// No

}

В документации:

-(nullable NSArray<NSString *> *)animationKeys;

Возвращает массив, содержащийключи всех анимаций, которые в данный момент * прикреплены к приемнику.Порядок массива соответствует порядку *, в котором будут применяться анимации.

1 голос
/ 29 марта 2018

Ссылка на вопрос: Положение центра UIView во время анимации

Я сравниваю фрейм представления и layer.presentation () ?. frame, чтобы проверить его анимацию. Если leftView находится на пути к завершению, кадр leftView.layer.presentation () ?. не равен его кадру:

if self.leftView.layer.presentation()?.frame == self.leftView.frame {
   // the animation finished
} else {
   // the animation on the way
}

Но этот метод может не работать, если вид перемещается в конечную позицию во время анимации. Может потребоваться дополнительная проверка состояния.

0 голосов
/ 03 апреля 2011

Вы можете запросить уровень презентации, как предложено здесь Мой уровень презентации не соответствует слою моей модели, даже если у меня нет анимации

...