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

Проверьте, находится ли UIView в середине анимации

Есть ли способ узнать, находится ли 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>>
4b9b3361

Ответ 1

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

Важно: если вы добавляете анимацию с помощью клавиши nil ([layer addAnimation:animation forKey:nil]), animationKeys возвращает nil.

Ответ 2

Анимации на самом деле привязаны к базовому классу Core Animation CALayer

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

Ответ 3

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

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0

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

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

Ответ 4

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

Ответ 5

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

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

Это означает, что неанимационный уровень может вернуть набор анимационных клавиш, даже если он фактически не анимируется.

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

например.

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

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

Ответ 6

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

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

@property BOOL viewIsAnimating;

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

[UIView animateWithDuration:0.25
                 animations:^{
                     viewIsAnimating = YES;
                 } completion:^(BOOL finished) {
                     if (finished) {
                         viewIsAnimating = NO;
                     }
                 }];

Ответ 7

Ссылка на вопрос: позиция центра 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
}

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

Ответ 8

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

if (view.layer.animationKeys.count) {

  // Animating

}else {

// No

}

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

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

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