56

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

アニメーションが停止してビューを印刷すると、「animations」エントリはなくなります。

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

10 に答える 10

43

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

重要nil:キー([layer addAnimation:animation forKey:nil])を使用してアニメーションを追加すると、animationKeysが返されますnil

于 2011-04-02T23:23:18.580 に答える
26

iOS 9以降の方法layer.animationKeysで、キーが含まれていない場合でも機能します。

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0

ドキュメントから:

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

于 2018-01-26T14:18:29.827 に答える
25

アニメーションは、実際には基盤となるCoreAnimationCALayerクラスにアタッチされています

だから私はあなたがただチェックすることができると思いますmyView.layer.animationKeys

于 2011-04-02T23:21:29.510 に答える
10

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

于 2012-05-21T14:46:42.240 に答える
10

ここには時代遅れの答えがたくさんあります。同じビューでアニメーションが実行されている場合にアニメーションが開始されないようにする必要UIViewがあったので、次のカテゴリを作成しましたUIView:-

extension UIView {

    var isAnimating: Bool {
        return (self.layer.animationKeys()?.count ?? 0) > 0
    }

}

このようにして、次のようにビューのアニメーションステータスを確認できます。-

if !myView.isAnimating {
  UIView.animate(withDuration: 0.4) {
    ...
  }
} else {
  // already animating
}

これは、状態変数で追跡するよりも脆弱ではないようです。

于 2019-10-24T14:58:26.083 に答える
5

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

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

つまり、アニメーション化されていないレイヤーは、実際にはアニメーション化されていなくても、animationKeysのセットを返す可能性があります。

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

例えば

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

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

于 2012-02-20T07:03:21.567 に答える
3

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

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

@property BOOL viewIsAnimating;

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

[UIView animateWithDuration:0.25
                 animations:^{
                     viewIsAnimating = YES;
                 } completion:^(BOOL finished) {
                     if (finished) {
                         viewIsAnimating = NO;
                     }
                 }];
于 2015-08-21T02:20:12.630 に答える
1

質問への参照:アニメーション中の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
}

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

于 2018-03-29T08:32:41.863 に答える
0

ここで提案されているように、プレゼンテーション層をクエリできます。アニメーションがないのに、プレゼンテーション層がモデル層と一致しません。

于 2011-04-03T07:18:59.983 に答える
0

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

if (view.layer.animationKeys.count) {

  // Animating

}else {

// No

}

ドキュメント内:

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

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

于 2019-05-24T12:37:25.720 に答える