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 | タップ(任意のタップ数を設定することができる) |
参考
関連記事
この他にもiOSでの開発ネタを紹介しております。Tipsなどまとめておりますのでこちらのページをご参照ください。