20

UIScrollViewaがスクロールしているかどうか(いつではないか)を検出しようとしています。

すなわち

BOOL isScrolling = myscrollview.scrolling;

これを実装するにはどうすればよいですか?.draggingを使用.deceleratingする場合は適用しないでくださいsetContentOffset:animated:

4

4 に答える 4

23

編集: この方法は、iOS 14 以降、機能しなくなったようです。別の方法を見つけられるかどうか試してみます。見つかった場合は、この回答を更新します。


これは少し危険な方法かもしれませんが、以前にコードで使用したことがあり、まだ失敗していません。:)

迅速

let isScrolling = scrollView.layer.animation(forKey: "bounds") != nil

Objective-C

BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;

self.contentOffsetのオフセットに加えて、のプロパティにUIScrollViewも保存されます(低レベルのコードでは少し便利なので推測します)。を呼び出すと、それがとして渡され、プロパティが操作されます。bounds.originUIView[setContentOffset:animated:]UIScrollViewCABasicAnimationbounds

確かに、このチェックは、スクロール ビュー自体の形状がアニメーション化されている場合にも true を返します。その場合、境界オブジェクトを実際にアニメーションから引き出し ( [CAAnimation toValue])、手動で比較して、originそれ自体がまったく変化しているかどうかを確認する必要があります。

これは最も洗練されたソリューションではありませんが、可能な限りスクロール ビュー デリゲートを使用する必要がないようにしたいと考えています。特に、問題のスクロール ビューが、そのデリゲートをパブリック API の一部として明示的に提供するサブクラスである可能性がある場合。:)

于 2013-03-25T16:29:21.227 に答える
7

私は通常、scrollViewWillBeginDragging:andscrollViewDidEndDragging:willDecelerate:イベントでブール変数を設定することによってこれを行います。

UIScrollViewドキュメント

于 2012-12-10T08:03:53.483 に答える