Riconoscitori di gesti
Esistono numerosi eventi (o gesti) di tocco comunemente utilizzati di cui è possibile ricevere notifiche quando si aggiunge un Riconoscimento gesti alla vista. I seguenti tipi di gesti sono supportati per impostazione predefinita:
UITapGestureRecognizer
Tocca (toccando brevemente lo schermo una o più volte)
UILongPressGestureRecognizer
Tocco lungo (toccando lo schermo per molto tempo)
UIPanGestureRecognizer
Pan (muovendo il dito sullo schermo)
UISwipeGestureRecognizer
Scorri (muovendo rapidamente il dito)
UIPinchGestureRecognizer
Pizzica (muovendo due dita insieme o separatamente - di solito per ingrandire)
UIRotationGestureRecognizer
Ruota (muovendo due dita in una direzione circolare)
Oltre a questi, puoi anche creare il tuo riconoscimento gesti personalizzato.
Aggiunta di un gesto nel Interface Builder
Trascina un riconoscimento gesti dalla libreria degli oggetti sulla tua vista.
Controlla il trascinamento dal gesto nella Struttura del documento al codice del tuo View Controller per creare un Outlet e un'azione.
Questo dovrebbe essere impostato di default, ma assicurati anche che User Action Enabled sia impostato su true per la tua vista.
Aggiunta di un gesto a livello di codice
Per aggiungere un gesto a livello di codice, è necessario (1) creare un riconoscimento gesti, (2) aggiungerlo a una vista e (3) creare un metodo che viene chiamato quando il gesto viene riconosciuto.
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")
}
}
Appunti
- Il
sender
parametro è facoltativo Se non hai bisogno di un riferimento al gesto, puoi lasciarlo fuori. In tal caso, tuttavia, rimuovere il(sender:)
nome del metodo di azione dopo.
- La denominazione del
handleTap
metodo era arbitraria. Denominalo come preferisci .action: #selector(someMethodName(sender:))
Altri esempi
Puoi studiare i riconoscitori di gesti che ho aggiunto a queste viste per vedere come funzionano.
Ecco il codice per quel progetto:
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
}
}
}
Appunti
- È possibile aggiungere più riconoscitori di gesti a una singola vista. Per semplicità, tuttavia, non l'ho fatto (tranne per il gesto di scorrimento). Se è necessario per il progetto, è necessario leggere la documentazione del riconoscimento gesti . È abbastanza comprensibile e utile.
- Problemi noti con i miei esempi precedenti: (1) La vista panoramica reimposta la sua cornice al prossimo evento di gesto. (2) La vista a scorrimento proviene dalla direzione sbagliata al primo colpo. (Questi bug nei miei esempi non dovrebbero influenzare la tua comprensione di come funzionano i Riconoscitori di gesti.)