Gestenerkenner
Es gibt eine Reihe häufig verwendeter Berührungsereignisse (oder Gesten), über die Sie benachrichtigt werden können, wenn Sie Ihrer Ansicht einen Gestenerkenner hinzufügen . Die folgenden Gestenarten werden standardmäßig unterstützt:
UITapGestureRecognizer
Tippen Sie auf (kurz oder mehrmals kurz auf den Bildschirm tippen)
UILongPressGestureRecognizer
Lange Berührung (langes Berühren des Bildschirms)
UIPanGestureRecognizer
Schwenken (Bewegen Sie Ihren Finger über den Bildschirm)
UISwipeGestureRecognizer
Streichen (Finger schnell bewegen)
UIPinchGestureRecognizer
Prise (zwei Finger zusammen oder auseinander bewegen - normalerweise zum Zoomen)
UIRotationGestureRecognizer
Drehen (zwei Finger in kreisförmiger Richtung bewegen)
Darüber hinaus können Sie Ihren eigenen Gestenerkenner erstellen.
Hinzufügen einer Geste im Interface Builder
Ziehen Sie einen Gestenerkenner aus der Objektbibliothek in Ihre Ansicht.
Steuern Sie das Ziehen von der Geste in der Dokumentübersicht auf Ihren View Controller-Code, um ein Outlet und eine Aktion zu erstellen.
Dies sollte standardmäßig festgelegt sein, aber stellen Sie auch sicher, dass User Action Enabled für Ihre Ansicht auf true festgelegt ist.
Programmgesteuertes Hinzufügen einer Geste
Um eine Geste programmgesteuert hinzuzufügen, erstellen Sie (1) eine Gestenerkennung, (2) fügen Sie sie einer Ansicht hinzu und (3) erstellen Sie eine Methode, die aufgerufen wird, wenn die Geste erkannt wird.
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")
}
}
Anmerkungen
- Der
sender
Parameter ist optional. Wenn Sie keinen Verweis auf die Geste benötigen, können Sie ihn weglassen. Wenn Sie dies jedoch tun, entfernen Sie den (sender:)
Namen der Methode nach der Aktion.
- Die Benennung der
handleTap
Methode war willkürlich. Nennen Sie es wie Sie wollen .action: #selector(someMethodName(sender:))
Mehr Beispiele
Sie können die Gestenerkenner untersuchen, die ich diesen Ansichten hinzugefügt habe, um zu sehen, wie sie funktionieren.
Hier ist der Code für dieses Projekt:
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
}
}
}
Anmerkungen
- Sie können einer einzelnen Ansicht mehrere Gestenerkenner hinzufügen. Der Einfachheit halber habe ich das jedoch nicht getan (mit Ausnahme der Wischgeste). Wenn Sie dies für Ihr Projekt benötigen, sollten Sie die Dokumentation zur Gestenerkennung lesen . Es ist ziemlich verständlich und hilfreich.
- Bekannte Probleme mit meinen obigen Beispielen: (1) Die Schwenkansicht setzt ihren Rahmen beim nächsten Gestenereignis zurück. (2) Die Wischansicht kommt beim ersten Wischen aus der falschen Richtung. (Diese Fehler in meinen Beispielen sollten jedoch Ihr Verständnis der Funktionsweise von Gestenerkennern nicht beeinträchtigen.)