LoginSignup
7
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-13

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

  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)  //  不要・あると動かない。
    
7
9
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
7
9