酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Swiftでシングルタップとダブルタップとロングプレス(ホールド)に同時に対応する

iOS 3.2からUIGestureRecognizerが追加されてからよく使っていたのですが、シングルタップとダブルタップ、ホールド(ロングプレス)に同時に対応します。

シングルタップとダブルタップはUITapGestureRecognizerクラスで対応することができます。ホールド(長押し)はUILongPressGestureRecognizerクラスで対応することができますね。

func getView() -> UIView {
    let myView: UIView = UIView(frame: CGRectMake(0, 0, 20, 100)))
    
    // ダブルタップ
    let doubleTap = UITapGestureRecognizer(target: myView, action: "tappdDouble:")
    doubleTap.numberOfTapsRequired = 2
    myView.addGestureRecognizer(doubleTap)
    
    // シングルタップ
    let singleTap = UITapGestureRecognizer(target: myView, action: "tappedSingle:")
    singleTap.numberOfTapsRequired = 1
    singleTap.requireGestureRecognizerToFail(doubleTap)
    myView.addGestureRecognizer(singleTap)
    
    // ホールド
    let longPress = UILongPressGestureRecognizer(target: myView, action: "pressedLong:")
    myView.addGestureRecognizer(longPress)
    
    return myView
}

func tappdDouble(sender: UITapGestureRecognizer!) {
    // ダブルタップしたときの処理
}

func tappedSingle(sender: UITapGestureRecognizer!) {
    // シングルタップしたときの処理
}

func pressedLong(sender: UILongPressGestureRecognizer!) {
    // 長押ししたときの処理

    // ジェスチャーの状態に応じて処理を分ける
    switch sender.state {
    case .Began:
        break
    case .Cancelled:
        break
    case .Ended:
        break
    case .Failed:
        break
    default:
        break
    }
}

シングルタップとダブルタップはイベントが競合してしまうので、ダブルタップしたとしてもシングルタップにしか反応しません。requireGestureRecognizerToFailメソッドをつかうことでシングルタップの認識に失敗した時に別のUIGestureRecognizerクラスにイベントを受け流すことができます。

クラス 説明
UILongPressGestureRecognizer ホールド(長押しを設定できる)
UIPanGestureRecognizer パン(ドラッグ&ドロップに対応できる)
UIPinchGestureRecognizer ピンチ(拡大や縮小を設定することができる)
UIRotationGestureRecognizer 回転(任意の方向の回転を設定することができる)
UISwipeGestureRecognizer スワイプ(任意の方向の移動を設定することができる)
UITapGestureRecognizer タップ(任意のタップ数を設定することができる)

参考

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/index.html#//apple_ref/occ/cl/UIGestureRecognizer

関連記事

この他にもiOSでの開発ネタを紹介しております。Tipsなどまとめておりますのでこちらのページをご参照ください。