1
1

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 3 years have passed since last update.

UIScrollViewが慣性スクロール中かどうか知る

Last updated at Posted at 2021-01-28

概要

UIScrollViewがスクロール中かどうかを知りたかったので、方法を調べた。

環境

  • iPadOS14.2
  • iOS14
  • swift

結果

ペンシルのことを考慮しない場合は

UIScrollView.isDecelerating

というプロパティが生えているので、これを使うことができる。
※詳しく調査していないが、以前はこれだけだと問題があったようだが、現時点(iOS14)では(ほぼ)これでうまくいく

ただ、慣性スクロールを指で止めた場合は問題ないが、ペンシルで止めた場合、isDeceleratingがtrueになりっぱなしで困った。

調査の結果、以下のようなワークアラウンドで回避できた。


extension UIScrollView  {
    // こんな処理を用意してあげて
    func stopDecelerating() {
        let contentOffset = self.contentOffset
        self.setContentOffset(contentOffset, animated: false)
    }
}

// 対象のUIScrollViewのtouchesShouldBeginなどをオーバーライドして、
// ペンシルの場合は、明示的にスクロールを止める
class HogeView: UIScrollView {

    override public func touchesShouldBegin(
        _ touches: Set<UITouch>, with event: UIEvent?, in view: UIView
    ) -> Bool {

        if isDecelerating && touches.contains(where: { $0.type == .pencil }) {
            stopDecelerating()
        }
    }
}

参考

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?