ท่าทางจดจำ
มีกิจกรรมสัมผัส (หรือท่าทางสัมผัส) ที่ใช้กันทั่วไปจำนวนมากซึ่งคุณสามารถรับการแจ้งเตือนเมื่อคุณเพิ่มเครื่องมือจดจำลายนิ้วมือในมุมมองของคุณ ประเภทท่าทางเหล่านี้สนับสนุนโดยค่าเริ่มต้น:
UITapGestureRecognizer
แตะ (สัมผัสหน้าจอสั้น ๆ อย่างน้อยหนึ่งครั้ง)
UILongPressGestureRecognizer
สัมผัสยาว (สัมผัสหน้าจอเป็นเวลานาน)
UIPanGestureRecognizer
แพน (เลื่อนนิ้วผ่านหน้าจอ)
UISwipeGestureRecognizer
ปัด (เลื่อนนิ้วอย่างรวดเร็ว)
UIPinchGestureRecognizer
หยิก (เลื่อนสองนิ้วด้วยกันหรือแยกออกจากกัน - ปกติเพื่อซูม)
UIRotationGestureRecognizer
หมุน (เลื่อนสองนิ้วในทิศทางวงกลม)
นอกเหนือจากสิ่งเหล่านี้คุณยังสามารถสร้างตัวจดจำท่าทางที่กำหนดเองของคุณเอง
การเพิ่มท่าทางในเครื่องมือสร้างส่วนต่อประสาน
ลากตัวจำแนกท่าทางจากไลบรารีวัตถุไปยังมุมมองของคุณ
ควบคุมการลากจากท่าทางใน Document Outline ไปยังรหัส View Controller ของคุณเพื่อสร้าง Outlet และ Action
ควรตั้งค่านี้เป็นค่าเริ่มต้น แต่ต้องแน่ใจว่า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:)
after action action
- การตั้งชื่อของ
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) มุมมองปัดมาจากทิศทางที่ผิดในการปัดครั้งแรก (ข้อบกพร่องเหล่านี้ในตัวอย่างของฉันไม่ควรส่งผลกระทบต่อความเข้าใจของคุณเกี่ยวกับการทำงานของตัวจำแนกลายมือท่าทาง)