ジェスチャーレコグナイザー
ジェスチャーレコグナイザーをビューに追加すると通知される、よく使用されるタッチイベント(またはジェスチャー)がいくつかあります。次のジェスチャータイプはデフォルトでサポートされています。
UITapGestureRecognizer
タップ(画面を1回以上短くタッチ)
UILongPressGestureRecognizer
ロングタッチ(画面を長時間タッチ)
UIPanGestureRecognizer
パン(画面上で指を動かす)
UISwipeGestureRecognizer
スワイプ(指をすばやく動かす)
UIPinchGestureRecognizer
ピンチ(2本の指を近づけたり離したりする-通常はズームする)
UIRotationGestureRecognizer
回転(2本の指を円周方向に動かす)
これらに加えて、独自のカスタムジェスチャー認識機能を作成することもできます。
Interface Builderでジェスチャーを追加する
オブジェクトライブラリからビューにジェスチャレコグナイザをドラッグします。
アウトレットとアクションを作成するために、ドキュメントアウトラインのジェスチャからビューコントローラコードへのドラッグを制御します。
これはデフォルトで設定する必要がありますが、ビューで[User Action Enabled]がtrueに設定されていることも確認してください。
プログラムによるジェスチャーの追加
プログラムでジェスチャーを追加するには、(1)ジェスチャー認識機能を作成し、(2)ジェスチャーをビューに追加し、(3)ジェスチャーが認識されたときに呼び出されるメソッドを作成します。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// 1. create a gesture recognizer (tap gesture)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
// 2. add the gesture recognizer to a view
myView.addGestureRecognizer(tapGesture)
}
// 3. this method is called when a tap is recognized
@objc func handleTap(sender: UITapGestureRecognizer) {
print("tap")
}
}
ノート
- この
sender
パラメーターはオプションです。ジェスチャーへの参照が必要ない場合は、省略できます。ただし、そうする場合は(sender:)
、アクションメソッド名の後を削除します。
handleTap
メソッドの命名は任意でした。好きな名前を付けてください。action: #selector(someMethodName(sender:))
その他の例
これらのビューに追加したジェスチャー認識機能を調べて、それらがどのように機能するかを確認できます。
これがそのプロジェクトのコードです。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tapView: UIView!
@IBOutlet weak var doubleTapView: UIView!
@IBOutlet weak var longPressView: UIView!
@IBOutlet weak var panView: UIView!
@IBOutlet weak var swipeView: UIView!
@IBOutlet weak var pinchView: UIView!
@IBOutlet weak var rotateView: UIView!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Tap
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapView.addGestureRecognizer(tapGesture)
// Double Tap
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
doubleTapView.addGestureRecognizer(doubleTapGesture)
// Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gesture:)))
longPressView.addGestureRecognizer(longPressGesture)
// Pan
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:)))
panView.addGestureRecognizer(panGesture)
// Swipe (right and left)
let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
swipeRightGesture.direction = UISwipeGestureRecognizerDirection.right
swipeLeftGesture.direction = UISwipeGestureRecognizerDirection.left
swipeView.addGestureRecognizer(swipeRightGesture)
swipeView.addGestureRecognizer(swipeLeftGesture)
// Pinch
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(gesture:)))
pinchView.addGestureRecognizer(pinchGesture)
// Rotate
let rotateGesture = UIRotationGestureRecognizer(target: self, action: #selector(handleRotate(gesture:)))
rotateView.addGestureRecognizer(rotateGesture)
}
// Tap action
@objc func handleTap() {
label.text = "Tap recognized"
// example task: change background color
if tapView.backgroundColor == UIColor.blue {
tapView.backgroundColor = UIColor.red
} else {
tapView.backgroundColor = UIColor.blue
}
}
// Double tap action
@objc func handleDoubleTap() {
label.text = "Double tap recognized"
// example task: change background color
if doubleTapView.backgroundColor == UIColor.yellow {
doubleTapView.backgroundColor = UIColor.green
} else {
doubleTapView.backgroundColor = UIColor.yellow
}
}
// Long press action
@objc func handleLongPress(gesture: UILongPressGestureRecognizer) {
label.text = "Long press recognized"
// example task: show an alert
if gesture.state == UIGestureRecognizerState.began {
let alert = UIAlertController(title: "Long Press", message: "Can I help you?", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
// Pan action
@objc func handlePan(gesture: UIPanGestureRecognizer) {
label.text = "Pan recognized"
// example task: drag view
let location = gesture.location(in: view) // root view
panView.center = location
}
// Swipe action
@objc func handleSwipe(gesture: UISwipeGestureRecognizer) {
label.text = "Swipe recognized"
// example task: animate view off screen
let originalLocation = swipeView.center
if gesture.direction == UISwipeGestureRecognizerDirection.right {
UIView.animate(withDuration: 0.5, animations: {
self.swipeView.center.x += self.view.bounds.width
}, completion: { (value: Bool) in
self.swipeView.center = originalLocation
})
} else if gesture.direction == UISwipeGestureRecognizerDirection.left {
UIView.animate(withDuration: 0.5, animations: {
self.swipeView.center.x -= self.view.bounds.width
}, completion: { (value: Bool) in
self.swipeView.center = originalLocation
})
}
}
// Pinch action
@objc func handlePinch(gesture: UIPinchGestureRecognizer) {
label.text = "Pinch recognized"
if gesture.state == UIGestureRecognizerState.changed {
let transform = CGAffineTransform(scaleX: gesture.scale, y: gesture.scale)
pinchView.transform = transform
}
}
// Rotate action
@objc func handleRotate(gesture: UIRotationGestureRecognizer) {
label.text = "Rotate recognized"
if gesture.state == UIGestureRecognizerState.changed {
let transform = CGAffineTransform(rotationAngle: gesture.rotation)
rotateView.transform = transform
}
}
}
ノート
- 1つのビューに複数のジェスチャー認識機能を追加できます。ただし、簡単にするために、スワイプジェスチャーを除いて、それはしませんでした。プロジェクトに必要な場合は、ジェスチャー認識機能のドキュメントをお読みください。それはかなり理解しやすく、役に立ちます。
- 上記の例に関する既知の問題:(1)パンビューは、次のジェスチャーイベントでフレームをリセットします。(2)スワイプビューは、最初のスワイプで間違った方向から表示されます。(ただし、私の例のこれらのバグは、ジェスチャーレコグナイザーがどのように機能するかについての理解に影響を与えません。)