Pengenal Gerakan
Ada sejumlah peristiwa sentuh (atau gerakan) yang umum digunakan yang dapat Anda beri tahu saat Anda menambahkan Gesture Recognizer ke tampilan Anda. Mereka mengikuti jenis gerakan didukung secara default:
UITapGestureRecognizer
Ketuk (menyentuh layar sebentar satu atau lebih kali)
UILongPressGestureRecognizer
Sentuhan panjang (menyentuh layar untuk waktu yang lama)
UIPanGestureRecognizer
Geser (gerakkan jari Anda melintasi layar)
UISwipeGestureRecognizer
Geser (gerakkan jari dengan cepat)
UIPinchGestureRecognizer
Jepit (gerakkan dua jari bersamaan atau terpisah - biasanya untuk memperbesar)
UIRotationGestureRecognizer
Putar (menggerakkan dua jari dalam arah melingkar)
Selain itu, Anda juga dapat membuat pengenal isyarat khusus sendiri.
Menambahkan Gerakan di Pembuat Antarmuka
Seret pengenal isyarat dari pustaka objek ke tampilan Anda.
Kendalikan kontrol dari gerakan di Outline Dokumen ke kode Pengontrol Tampilan Anda untuk membuat Outlet dan Tindakan.
Ini harus ditetapkan secara default, tetapi juga memastikan bahwa Tindakan Pengguna Diaktifkan disetel ke true untuk tampilan Anda.
Menambahkan Gerakan secara Programatis
Untuk menambahkan gerakan secara terprogram, Anda (1) membuat pengenal gerakan, (2) menambahkannya ke tampilan, dan (3) membuat metode yang disebut ketika gerakan dikenali.
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")
}
}
Catatan
- The
sender
parameter opsional. Jika Anda tidak perlu referensi ke isyarat maka Anda dapat meninggalkannya. Jika Anda melakukannya, hapus (sender:)
nama metode tindakan setelah.
- Penamaan
handleTap
metode ini sewenang-wenang. Beri nama apa pun yang ingin Anda gunakan .action: #selector(someMethodName(sender:))
Lebih banyak contoh
Anda dapat mempelajari pengenal isyarat yang saya tambahkan ke tampilan ini untuk melihat cara kerjanya.
Berikut adalah kode untuk proyek itu:
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
}
}
}
Catatan
- Anda dapat menambahkan beberapa pengenal isyarat ke satu tampilan. Demi kesederhanaan, saya tidak melakukan itu (kecuali untuk gerakan gesek). Jika Anda perlu untuk proyek Anda, Anda harus membaca dokumentasi gesture recognition . Ini cukup dimengerti dan bermanfaat.
- Masalah yang diketahui dengan contoh saya di atas: (1) Tampilan pan me-reset frame-nya pada acara gesture berikutnya. (2) Tampilan gesek berasal dari arah yang salah pada gesekan pertama. (Bug-bug ini dalam contoh saya seharusnya tidak memengaruhi pemahaman Anda tentang cara kerja Pengenal Gerakan.)