Розпізнавачі жестів
Існує ряд часто використовуваних сенсорних подій (або жестів), про які ви можете отримувати сповіщення, додаючи до свого перегляду розпізнавальник жестів . Такі типи жестів підтримуються за замовчуванням:
UITapGestureRecognizer
Торкніться (короткий дотик до екрана один чи кілька разів)
UILongPressGestureRecognizer
Довгий дотик ( тривалий дотик до екрана)
UIPanGestureRecognizer
Панорама (переміщення пальця по екрану)
UISwipeGestureRecognizer
Проведіть пальцем (швидко рухається пальцем)
UIPinchGestureRecognizer
Щип (переміщення двома пальцями разом або один від одного - зазвичай для збільшення)
UIRotationGestureRecognizer
Поворот (переміщення двома пальцями в круговому напрямку)
На додаток до них, ви також можете зробити власний розпізнавальний жест.
Додавання жесту в програмі інтерфейсу
Перетягніть розпізнавальник жестів із бібліотеки об'єктів на ваш погляд.
Контролюйте перетягування від жесту в контуру документа до коду контролера перегляду, щоб зробити розетку та дію.
Це потрібно встановити за замовчуванням, але також переконайтеся, що для дії користувача включено значення 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) Перегляд "Панораму" скидає рамку для наступної події жесту. (2) Перегляд пальцем пальця відбувається з неправильного напрямку на першому пальці. (Ці помилки в моїх прикладах не повинні впливати на ваше розуміння того, як працюють засоби розпізнавання жестів.)