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>>
UIViewにはレイヤーがあります( CALayer )。これに animationKeys を送信すると、レイヤーにアタッチされたアニメーションを識別するキーの配列が提供されます。エントリがある場合、アニメーションが実行されていると思います。さらに深く掘り下げたい場合は、CALayerが採用している CAMediaTiming protocol をご覧ください。現在のアニメーションに関する詳細情報を提供します。
アニメーションは、実際には基になるCore Animation CALayer
クラスに添付されます
だから私はあなたがちょうどmyView.layer.animationKeys
iOS 9以降のメソッド、layer.animationKeys
にはキーが含まれていません。
let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0
ドキュメントから:
このメソッドは、UIViewアニメーションブロック内で呼び出された場合にゼロ以外の値のみを返します。
質問の文脈は定かではありませんが、スキップを避けるために、2番目のアニメーションを開始する前にビューがアニメーション化されているかどうかを確認しようとしていました。ただし、必要に応じてアニメーションを組み合わせて滑らかな外観にするUIViewアニメーションオプションUIViewAnimationOptionBeginFromCurrentState
があります。これにより、ビューがアニメートされているかどうかを知る必要がなくなりました。
AnimationKeysトリックには問題があります。
アニメーションが完了した後、いくつかのanimationKeysが残る場合があります。
これは、実際にアニメーション化されていない場合でも、非アニメーション化レイヤーが一連のanimationKeysを返す可能性があることを意味します。
アニメーションのremovedOnCompletionプロパティをYESに設定すると、animationKeysが自動的に削除されることを確認できます。
例えば.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"aPath"];
animation.removedOnCompletion = YES;
レイヤーに適用するすべてのアニメーションに対してこれを行うと、レイヤーがアニメートしていないときに、animationKeysが存在しないことが保証されます。
これらのいくつかは私にとってはうまくいきませんでした。その理由は、これらのアニメーションが非同期であるためです。
私がしたことはプロパティを定義することです
@property BOOL viewIsAnimating;
そして私のアニメーションで
[UIView animateWithDuration:0.25
animations:^{
viewIsAnimating = YES;
} completion:^(BOOL finished) {
if (finished) {
viewIsAnimating = NO;
}
}];
質問を参照してください: アニメーション中の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
}
ただし、アニメーション中にビューが終了位置に移動した場合、この方法は機能しない場合があります。より多くの状態チェックが必要な場合があります。
UIViewのレイヤープロパティを使用できます。 CALayerにはアニメーションキーと呼ばれるプロパティがあり、0より大きい場合はカウントを確認できます。
if (view.layer.animationKeys.count) {
// Animating
}else {
// No
}
ドキュメント内:
-(nullable NSArray<NSString *> *)animationKeys;
レシーバーに現在アタッチされているすべてのアニメーションのキーを含む配列を返します。配列の順序は、アニメーションが適用される順序*と一致します。
ここで提案されているようにプレゼンテーションレイヤーを照会できます アニメーションがなくてもプレゼンテーションレイヤーはモデルレイヤーと一致しません