概要
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()
}
}
}