iOS
Swift
GestureRecognizer

UITapGestureRecognizer のシングルタップとダブルタップを共存させる方法

いつも忘れて検索するのでメモ

  1. 最初に結論

    • singleTapGesture.require(toFail: doubleTapGesture) を実行する。
  2. サンプルコード

    • require toFail が追加される以外は通常と同じ。
    共存
    //  シングルタップの GestureRecognizer を someView に追加する。
    let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(MyViewController.onTap(gesture:)))
    singleTapGesture.numberOfTapsRequired = 1
    someView.addGestureRecognizer(singleTapGesture)
    
    //  ダブルタップの GestureRecognizer を someView に追加する。
    let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(MyViewController.onTap(gesture:)))
    doubleTapGesture.numberOfTapsRequired = 2
    someView.addGestureRecognizer(doubleTapGesture)
    
    //  両方を有効にするために必要
    singleTapGesture.require(toFail: doubleTapGesture)
    
    • セレクタはそれぞれの GestureRecognizer で分けるのもありだが、同一にする場合は gesture.numberOfTapsRequired で判定。
    セレクタの例
    @objc fileprivate func onTap(gesture: UITapGestureRecognizer) {
        if gesture.numberOfTapsRequired == 1 {
            // シングルタップ時の動作
        }
        else if gesture.numberOfTapsRequired == 2 {
            // ダブルタップ時の動作
        }
    }
    
  3. 補足

    • doubleTapGesture.require(...だと正しく動作しない。
    • singleTapGesture.require(...doubleTapGesture.require(... の両方があってもだめ。
    正しく動かない例
    ()
    singleTapGesture.require(toFail: doubleTapGesture)  //  必要
    doubleTapGesture.require(toFail: singleTapGesture)  //  不要・あると動かない。