UIScrollViewのスクロールを、1本指ではなく、2本指でスクロールできるようにする方法を紹介します。 非常にかんたんなので、一回覚えればもう忘れることはありません。

override func viewDidLoad() {
    // 便宜的にここで生成
    let scrollView = UIScrollView(frame: view.bounds)
    scrollView.delegate = self
    view.addSubview(scrollView)

    // ここがキーポイント
    scrollView.panGestureRecognizer.minimumNumberOfTouches = 2
}

UIPanGestureRecognizer

UIPanGestureRecognizerは、ドラッグ操作のイベントを補足するGestureRecognizerです。 このRecognizerは、最小のタッチ数minimumNumberOfTouchと、最大のタッチ数maximumNumberOfTouchを設定することができます。詳しくは、Appleのドキュメントをご覧ください。

UIPanGestureRecognizer - UIKit | Apple Developer Documentation

今回は、UIScrollViewのスクロール=ドラッグ操作を2本指にするため、scrollView.panGestureRecognizerで取得したインスタンスに対し、minimumNumberOfTouch2でセットしました。 こうすることで、1本指ではスクロールできず、2本指からスクロールできるようになります。

なお、UIScrollViewはpanGestureRecognizerを{ get }のみ公開しています。外からセットすることはできません。 そのため、UIScrollViewから取得したUIPanGestureRecognizerのインスタンスに対して処理を書く必要があります。

UIScrollView.panGestureRecogniser

PinchGestureとは競合しないか

PinchかPanかの判別はシステムがいい感じにしてくれる(というよりは、実装者が意識しなくても良いようなAPI設計になっている)ので、ジェスチャの競合を考慮する必要はありません。


UIScrollViewのスクロールを、2本指で操作できるようにする実装を紹介しました。 UIGestureRecognizerには、今回の「Pan」以外にも「ScreenEdgePan」「Tap」「Pinch」「Rotation」「Swipe」「LongPress」といった便利なジェスチャが用意されています。 アプリのインタラクションを独自で作り込む際は、これらの各種ジェスチャを把握した上で、快適な操作を実現していきたいですね。