Распознаватели жестов
Существует ряд часто используемых сенсорных событий (или жестов), о которых вы можете получать уведомления, когда добавляете к своему представлению Распознаватель жестов .Следующие типы жестов поддерживаются по умолчанию:
UITapGestureRecognizer
Коснитесь (короткое касание экрана один или несколько раз) UILongPressGestureRecognizer
Длинное касание (длительное касание экрана) UIPanGestureRecognizer
Панорамирование (перемещение пальцем по экрану) UISwipeGestureRecognizer
Размах (быстрое движение пальца) UIPinchGestureRecognizer
Щепотка (движение двумя пальцами вместе или врозь - обычно для увеличения) UIRotationGestureRecognizer
Поворот (двигая двумя пальцами по кругу)
В дополнение к этому вы также можете сделать свой собственный распознаватель жестов.
Добавление жеста в Интерфейсном Разработчике
Перетащите распознаватель жестов из библиотеки объектов на ваше представление.
Управляйте перетаскиванием из жеста в структуре документа в представление.Код контроллера для создания розетки и действия.
Это должно быть установлено по умолчаниюа также убедитесь, что для User Action Enabled установлено значение 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(<strong>someMethodName</strong>(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) При первом пролистывании изображение смахивает с неправильного направления.(Эти ошибки в моих примерах не должны влиять на ваше понимание того, как работают распознаватели жестов.)