web-dev-qa-db-ja.com

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>>
45
prostock

UIViewにはレイヤーがあります( CALayer )。これに animationKeys を送信すると、レイヤーにアタッチされたアニメーションを識別するキーの配列が提供されます。エントリがある場合、アニメーションが実行されていると思います。さらに深く掘り下げたい場合は、CALayerが採用している CAMediaTiming protocol をご覧ください。現在のアニメーションに関する詳細情報を提供します。

39
Nick Weaver

アニメーションは、実際には基になるCore Animation CALayerクラスに添付されます

だから私はあなたがちょうどmyView.layer.animationKeys

25
Vincent Guerci

iOS 9以降のメソッドlayer.animationKeysにはキーが含まれていません。

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0

ドキュメントから:

このメソッドは、UIViewアニメーションブロック内で呼び出された場合にゼロ以外の値のみを返します。

10
deej

質問の文脈は定かではありませんが、スキップを避けるために、2番目のアニメーションを開始する前にビューがアニメーション化されているかどうかを確認しようとしていました。ただし、必要に応じてアニメーションを組み合わせて滑らかな外観にするUIViewアニメーションオプションUIViewAnimationOptionBeginFromCurrentStateがあります。これにより、ビューがアニメートされているかどうかを知る必要がなくなりました。

8
Ryan Poolos

AnimationKeysトリックには問題があります。

アニメーションが完了した後、いくつかのanimationKeysが残る場合があります。

これは、実際にアニメーション化されていない場合でも、非アニメーション化レイヤーが一連のanimationKeysを返す可能性があることを意味します。

アニメーションのremovedOnCompletionプロパティをYESに設定すると、animationKeysが自動的に削除されることを確認できます。

例えば.

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

レイヤーに適用するすべてのアニメーションに対してこれを行うと、レイヤーがアニメートしていないときに、animationKeysが存在しないことが保証されます。

5
C4 - Travis

これらのいくつかは私にとってはうまくいきませんでした。その理由は、これらのアニメーションが非同期であるためです。

私がしたことはプロパティを定義することです

@property BOOL viewIsAnimating;

そして私のアニメーションで

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

質問を参照してください: アニメーション中のUIViewの中心位置

ビューのフレームとlayer.presentation()?. frameを比較して、アニメーション化されていることを確認します。 leftViewが終了する場合、leftView.layer.presentation()?. frameはそのフレームと等しくありません。

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

ただし、アニメーション中にビューが終了位置に移動した場合、この方法は機能しない場合があります。より多くの状態チェックが必要な場合があります。

1
Bill Chan

UIViewのレイヤープロパティを使用できます。 CALayerにはアニメーションキーと呼ばれるプロパティがあり、0より大きい場合はカウントを確認できます。

if (view.layer.animationKeys.count) {

  // Animating

}else {

// No

}

ドキュメント内:

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

レシーバーに現在アタッチされているすべてのアニメーションのキーを含む配列を返します。配列の順序は、アニメーションが適用される順序*と一致します。

1
varunrathi28

ここで提案されているようにプレゼンテーションレイヤーを照会できます アニメーションがなくてもプレゼンテーションレイヤーはモデルレイヤーと一致しません

0
HeikoG