【Swift4】UIScrollViewのデリゲート、スクロール開始・中・停止、ズーム開始・中・停止まとめ【iOS11】

2020年8月27日

UIScrollViewはデリゲートメソッドが多く、どれを使えばいいのか迷いがちなので、デリゲートメソッドを「ドラッグによるスクロール」「ズーム」「その他」の3種類に分類し、それぞれのライフサイクルについてもまとめました。

もくじ

  1. スクロールした時に呼ばれるデリゲートメソッド
  2. ズームした時に呼ばれるデリゲートメソッド
  3. その他のデリゲートメソッド

1.タップ(ドラッグ)してスクロールをした時に呼ばれるデリゲートメソッド

スクロール時のデリゲートメソッドのライフサイクル

  1. scrollViewWillBeginDragging(_ scrollView: UIScrollView)
    タップしスクロール開始
  2. scrollViewDidScroll(_ scrollView: UIScrollView)
    スクロール中(画面に指が触れている状態)
  3. scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
    タップ終了開始時
  4. scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
    タップ終了時
  5. scrollViewWillBeginDecelerating(_ scrollView: UIScrollView)
    慣性によるスクロール開始時
  6. scrollViewDidScroll(_ scrollView: UIScrollView)
    スクロール中(画面から指が離れ、慣性によるスクロールになっている状態)
  7. scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
    慣性によるスクロール停止時(完全停止)

スクロール時のデリゲートメソッド

// 指が画面に触れ、スクロールが開始した瞬間に呼ばれる
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    print("scrollViewWillBeginDragging")
}
// スクロール中に呼ばれる
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print("scrollViewDidScroll")
}
// 指が画面から離れた瞬間に呼ばれる
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    print("scrollViewWillEndDragging withVelocity velocity targetContentOffset")
}
// 指が画面から離れた瞬間に呼ばれる
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    print("scrollViewWillBeginDragging willDecelerate decelerate")
}
// 指が画面から離れ、慣性のスクロールになる瞬間に呼ばれる
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    print("scrollViewWillBeginDragging")
}
// 指が画面から離れ、慣性のスクロールが完全に止まる瞬間に呼ばれる
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    print("scrollViewWillBeginDragging")
}

2.ズームした時に呼ばれるデリゲートメソッド

ズーム時のデリゲートメソッドのライフサイクル

  1. scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?)
    ズーム開始
  2. scrollViewDidZoom(_ scrollView: UIScrollView)
    ズーム中
  3. scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
    ズーム終了時

ズーム時のデリゲートメソッド

// ズーム開始時
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
    print("scrollViewWillBeginZooming with view")
}
// ズーム中
func scrollViewDidZoom(_ scrollView: UIScrollView) {
    print("scrollViewDidZoom")
}
// ズーム終了時
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
    print("scrollViewDidEndZooming, with view atScale scale")
}

3.その他のデリゲートメソッド

// ステータスバーをタップして、スクロールがトップにいった後に呼ばれる
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
    print("scrollViewDidScrollToTop")
}
// scrollView.setZoomScale(scale: CGFloat, animated: Bool)を使用してスクロールし終わった後に呼ばれる
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
    print("scrollViewDidEndScrollingAnimation")
}