Reconhecedores de gestos
Há vários eventos de toque comum (ou gestos) dos quais você pode ser notificado quando adiciona um Reconhecimento de gestos à sua exibição. Os seguintes tipos de gesto são suportados por padrão:
UITapGestureRecognizer
Toque em (toque brevemente na tela uma ou mais vezes)
UILongPressGestureRecognizer
Toque longo (tocando na tela por um longo tempo)
UIPanGestureRecognizer
Pan (movendo o dedo pela tela)
UISwipeGestureRecognizer
Deslize (movendo o dedo rapidamente)
UIPinchGestureRecognizer
Aperte (movendo dois dedos juntos ou separados - geralmente para aumentar o zoom)
UIRotationGestureRecognizer
Girar (movendo dois dedos em uma direção circular)
Além desses, você também pode criar seu próprio reconhecedor de gestos personalizado.
Adicionando um gesto no Interface Builder
Arraste um reconhecedor de gestos da biblioteca de objetos para a sua exibição.
Arraste o controle do gesto no Esboço do documento para o código do View Controller para criar uma saída e uma ação.
Isso deve ser definido por padrão, mas também verifique se a Ação do Usuário Ativada está definida como true para sua visualização.
Adicionando um gesto programaticamente
Para adicionar um gesto programaticamente, você (1) cria um reconhecedor de gestos, (2) o adiciona a uma visualização e (3) cria um método chamado quando o gesto é reconhecido.
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
- O
sender
parâmetro é opcional. Se você não precisar de uma referência ao gesto, pode deixar de fora. Se você fizer isso, remova o(sender:)
nome do método após a ação.
- A nomeação do
handleTap
método foi arbitrária. Nomeie como quiser .action: #selector(someMethodName(sender:))
Mais exemplos
Você pode estudar os reconhecedores de gestos que adicionei a essas visualizações para ver como eles funcionam.
Aqui está o código para esse projeto:
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
- Você pode adicionar vários reconhecedores de gestos a uma única exibição. Por uma questão de simplicidade, no entanto, eu não fiz isso (exceto pelo gesto de furto). Se você precisar para o seu projeto, leia a documentação do reconhecedor de gestos . É bastante compreensível e útil.
- Problemas conhecidos dos meus exemplos acima: (1) A visualização panorâmica redefine seu quadro no próximo evento de gesto. (2) A exibição de furto vem da direção errada no primeiro furto. (Esses erros nos meus exemplos não devem afetar sua compreensão de como funcionam os reconhecedores de gestos.)