Reconnaisseurs de gestes
Il existe un certain nombre d'événements tactiles (ou gestes) couramment utilisés dont vous pouvez être averti lorsque vous ajoutez un identificateur de geste à votre vue. Les types de mouvements suivants sont pris en charge par défaut:
UITapGestureRecognizer
Appuyez (en touchant brièvement une ou plusieurs fois l'écran)
UILongPressGestureRecognizer
Toucher long (toucher l'écran pendant longtemps)
UIPanGestureRecognizer
Pan (en déplaçant votre doigt sur l'écran)
UISwipeGestureRecognizer
Glisser (déplacer rapidement le doigt)
UIPinchGestureRecognizer
Pincer (en rapprochant ou en écartant deux doigts - généralement pour zoomer)
UIRotationGestureRecognizer
Rotation (déplacement de deux doigts dans une direction circulaire)
En plus de cela, vous pouvez également créer votre propre outil de reconnaissance des gestes personnalisé.
Ajout d'un geste dans le générateur d'interface
Faites glisser un identificateur de mouvements de la bibliothèque d'objets vers votre vue.
Contrôlez le glisser depuis le geste dans le plan du document vers votre code View Controller afin de créer une sortie et une action.
Cela doit être défini par défaut, mais assurez-vous également que l'action utilisateur activée est définie sur true pour votre affichage.
Ajout d'un geste par programme
Pour ajouter un geste par programmation, vous (1) créez un identificateur de geste, (2) l'ajoutez à une vue et (3) créez une méthode qui est appelée lorsque le geste est reconnu.
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")
}
}
Remarques
- Le
sender
paramètre est facultatif. Si vous n'avez pas besoin d'une référence au geste, vous pouvez le laisser de côté. Si vous le faites, supprimez le (sender:)
nom après la méthode d'action.
- La dénomination de la
handleTap
méthode était arbitraire. Nommez-le comme vous le souhaitez .action: #selector(someMethodName(sender:))
Plus d'exemples
Vous pouvez étudier les reconnaisseurs de mouvements que j'ai ajoutés à ces vues pour voir comment ils fonctionnent.
Voici le code de ce projet:
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
}
}
}
Remarques
- Vous pouvez ajouter plusieurs reconnaisseurs de mouvements à une seule vue. Par souci de simplicité, cependant, je ne l'ai pas fait (sauf pour le geste de balayage). Si vous en avez besoin pour votre projet, vous devriez lire la documentation de reconnaissance des gestes . C'est assez compréhensible et utile.
- Problèmes connus avec mes exemples ci-dessus: (1) La vue panoramique réinitialise son cadre lors du prochain événement gestuel. (2) La vue par balayage vient de la mauvaise direction lors du premier balayage. (Cependant, ces bogues dans mes exemples ne devraient pas affecter votre compréhension du fonctionnement des outils de reconnaissance des gestes.)