今日学んだことの共有です。
あるView
の「タップの開始」と「タップの終了」を検知するということをしたかったのですが、UITapGestureRecognizer
を使って実現しようとしたところUIGestureRecognizerState.Ended
の時しか設定したメソッドが呼ばれず、「タップの開始」時にやりたい処理ができませんでした。
少し調べたところ、UIGestureRecognizer
にはDiscrete Gesture
とContinuous Gesture
の2種類あることがわかりました。
(参考)Event Handling Guide for iOS
##Discrete Gesture
一度しか呼ばれないジェスチャです。以下の2種類があります。
試したところ、指を離したときに呼ばれました。(state
は.Ended
でした)
- UITapGestureRecognizer
- UISwipeGestureRecognizer
##Continuous Gesture
名前の通り連続して呼ばれるジェスチャです。以下の4種類があります。
正常に動作した場合、state
が順に.Began
、.Changed
(複数回繰り返し)、.Ended
と変わります。
- UIPinchGestureRecognizer
- UIPanGestureRecognizer
- UIRotationGestureRecognizer
- UILongPressGestureRecognizer
##今回やりたかったことの実現
今回やりたかったのは、UIView
をタップ中はview
の色を変え、指を離した際に色を戻すと同時に別の処理をするということでした。
UITapGestureRecognizer
では実現できなかったので、UILongPressGestureRecognizer
のminimumPressDuration
を0にして実現しました。
func setup() {
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(tapped))
gesture.minimumPressDuration = 0
myView.addGestureRecognizer(gesture)
}
func tapped(recognizer: UILongPressGestureRecognizer) {
switch recognizer.state {
case .Began:
myView.backgroundColor = UIColor.redColor()
print("Began")
case .Ended:
myView.backgroundColor = UIColor.blueColor()
print("Ended")
default:
myView.backgroundColor = UIColor.blueColor()
print("default")
}
}
以上になります。