はじめに
UIScrollViewが提供する、スクロールした時を検出するscrollViewDidScrollメソッドで、スクロールするアクションにおいて特定のスクロールアクションのみを検出する必要があったので、備忘録として記事化。
UIScrollViewのscrollViewDidScrollメソッドとは
公式ドキュメントによると...
ScrollView内でユーザがコンテンツをスクロールしたときにデリゲートに伝えます。by Apple Docs
以下、公式に載っていない気付き
- 指が触れる、指でドラッグする、指が離れた後にスクロールアニメーションが起こっている状態で、発火する
- 一度のスクロールで、何度呼ばれるかわからない
今回のキーとなるUIScrollViewのジェスチャー一覧
-
isTracking
ユーザーがコンテンツに触れてスクロールを開始したかどうかを示すbool値。(=コンテンツに触れたかどうか) -
isDragging
ユーザーがコンテンツのスクロールを開始したかどうかを示すbool値。(=触れてドラッグしたかどうか) -
isDecelerating
ユーザーが指を離した後、ScrollViewでコンテンツが動いているかどうかを示すbool値。(=触れてドラッグして離して、スクロールアニメーションが効いているかどうか)
満たすべき要件
画面トップをタップして、コンテンツのトップに遷移する動作のみ検出するためには...
コンテンツに触れても、ドラッグしてもいないが何故か動きを検出してしまった時
が検出できればゴールになります。
まとめ(詳細な実装)
struct MyView: UIViewRepresentable {
...
func makeCoordinator() -> Coordinator {
Coordinator()
}
class Coordinator: NSObject, UITableViewDelegate {
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
// トップに到達した時に発火する処理
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if !scrollView.isTracking, !scrollView.isDragging, !scrollView.isDecelerating {
// 画面のトップをタップして、スクロールアニメーションが開始した時に、発火させる処理
}
}
}
}
※尚、トップに到達した時に発火するメソッドは、scrollViewDidScrollToTop(_ scrollView: UIScrollView)
を使用します。