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

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

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

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

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

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

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

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

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

Существует зацепка с трюком animationKeys.

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

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

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

например

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

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

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

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

 @property BOOL viewIsAnimating; 

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

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

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

 let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0 

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

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

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

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

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

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

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

Interesting Posts
Давайте будем гением компьютера.