Công nhận cử chỉ
Có một số sự kiện chạm (hoặc cử chỉ) thường được sử dụng mà bạn có thể được thông báo khi bạn thêm Trình nhận dạng cử chỉ vào chế độ xem của mình. Chúng theo các kiểu cử chỉ được hỗ trợ theo mặc định:
UITapGestureRecognizer
Chạm (chạm nhanh vào màn hình một hoặc nhiều lần)
UILongPressGestureRecognizer
Chạm lâu (chạm vào màn hình trong một thời gian dài)
UIPanGestureRecognizer
Pan (di chuyển ngón tay của bạn trên màn hình)
UISwipeGestureRecognizer
Vuốt (di chuyển ngón tay nhanh chóng)
UIPinchGestureRecognizer
Chụm (di chuyển hai ngón tay với nhau hoặc tách rời - thường để phóng to)
UIRotationGestureRecognizer
Xoay (di chuyển hai ngón tay theo hướng tròn)
Ngoài những thứ này, bạn cũng có thể tạo bộ nhận dạng cử chỉ tùy chỉnh của riêng bạn.
Thêm một cử chỉ trong Trình tạo giao diện
Kéo trình nhận dạng cử chỉ từ thư viện đối tượng vào chế độ xem của bạn.
Kiểm soát kéo từ cử chỉ trong Phác thảo tài liệu sang mã Trình điều khiển xem của bạn để tạo một Outlet và một hành động.
Điều này nên được đặt theo mặc định, nhưng cũng đảm bảo rằng Hành động người dùng được bật được đặt thành đúng cho chế độ xem của bạn.
Thêm một cử chỉ lập trình
Để thêm một cử chỉ theo lập trình, bạn (1) tạo một trình nhận dạng cử chỉ, (2) thêm nó vào một khung nhìn và (3) tạo một phương thức được gọi khi nhận ra cử chỉ đó.
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")
}
}
Ghi chú
- Các
sender
tham số là tùy chọn. Nếu bạn không cần một tham chiếu đến cử chỉ thì bạn có thể bỏ nó ra. Nếu bạn làm như vậy, mặc dù, loại bỏ (sender:)
sau tên phương thức hành động.
- Việc đặt tên của
handleTap
phương pháp là tùy ý. Đặt tên cho nó bất cứ điều gì bạn muốn sử dụng .action: #selector(someMethodName(sender:))
Thêm ví dụ
Bạn có thể nghiên cứu các nhận dạng cử chỉ mà tôi đã thêm vào các chế độ xem này để xem cách chúng hoạt động.
Đây là mã cho dự án đó:
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
}
}
}
Ghi chú
- Bạn có thể thêm nhiều nhận dạng cử chỉ vào một chế độ xem. Tuy nhiên, để đơn giản, tôi đã không làm điều đó (ngoại trừ cử chỉ vuốt). Nếu bạn cần cho dự án của bạn, bạn nên đọc tài liệu nhận dạng cử chỉ . Nó là khá dễ hiểu và hữu ích.
- Các vấn đề đã biết với các ví dụ của tôi ở trên: (1) Pan view đặt lại khung của nó trong sự kiện cử chỉ tiếp theo. (2) Chế độ xem vuốt xuất phát từ hướng sai trong lần vuốt đầu tiên. (Tuy nhiên, những lỗi này trong các ví dụ của tôi sẽ không ảnh hưởng đến sự hiểu biết của bạn về cách thức hoạt động của Trình nhận dạng cử chỉ.)