Reconocedores de gestos
Hay una serie de eventos táctiles (o gestos) de uso común que se le pueden notificar cuando agrega un Reconocimiento de gestos a su vista. Los siguientes tipos de gestos son compatibles de forma predeterminada:
UITapGestureRecognizer
Toque (tocar la pantalla brevemente una o más veces)
UILongPressGestureRecognizer
Toque largo (tocar la pantalla durante mucho tiempo)
UIPanGestureRecognizer
Pan (moviendo el dedo por la pantalla)
UISwipeGestureRecognizer
Deslizar (mover el dedo rápidamente)
UIPinchGestureRecognizer
Pellizcar (mover dos dedos juntos o separados, generalmente para hacer zoom)
UIRotationGestureRecognizer
Rotar (mover dos dedos en dirección circular)
Además de estos, también puede hacer su propio reconocedor de gestos personalizado.
Agregar un gesto en el generador de interfaces
Arrastre un reconocedor de gestos desde la biblioteca de objetos a su vista.
Controle el arrastre desde el gesto en el Esquema del documento hasta el código de su Controlador de vista para hacer una salida y una acción.
Esto debe establecerse de manera predeterminada, pero también asegúrese de que la Acción del usuario habilitada esté establecida en verdadero para su vista.
Agregar un gesto mediante programación
Para agregar un gesto mediante programación, usted (1) crea un reconocedor de gestos, (2) lo agrega a una vista y (3) crea un método que se llama cuando se reconoce el gesto.
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")
}
}
Notas
- El
sender
parámetro es opcional. Si no necesita una referencia al gesto, puede omitirlo. Sin embargo, si lo hace, elimine el(sender:)
nombre del método después de la acción.
- La denominación del
handleTap
método fue arbitraria. Nómbralo como quieras usar .action: #selector(someMethodName(sender:))
Más ejemplos
Puede estudiar los reconocedores de gestos que agregué a estas vistas para ver cómo funcionan.
Aquí está el código para ese proyecto:
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
}
}
}
Notas
- Puede agregar múltiples reconocedores de gestos a una sola vista. Sin embargo, por simplicidad, no hice eso (excepto por el gesto de deslizar). Si lo necesita para su proyecto, debe leer la documentación del reconocedor de gestos . Es bastante comprensible y útil.
- Problemas conocidos con mis ejemplos anteriores: (1) La vista panorámica restablece su marco en el siguiente evento de gesto. (2) La vista de deslizamiento proviene de la dirección incorrecta en el primer deslizamiento. (Sin embargo, estos errores en mis ejemplos no deberían afectar su comprensión de cómo funcionan los reconocedores de gestos).