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などまとめておりますのでこちらのページをご参照ください。