2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UITableViewの画面トップタップ&トップ遷移は、UIScrollViewのscrollViewDidScrollメソッドで検出できる

Posted at

はじめに

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) を使用します。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?