ด้วย Swift 5 และ iOS 12 UIGestureRecognizerDelegate
มีวิธีการที่เรียกว่าgestureRecognizer(_:shouldReceive:)
. gestureRecognizer(_:shouldReceive:)
มีประกาศดังต่อไปนี้:
ถามผู้รับมอบสิทธิ์ว่าเครื่องจดจำท่าทางควรได้รับวัตถุที่แสดงถึงการสัมผัสหรือไม่
optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
gestureRecognizer(_:shouldReceive:)
รหัสที่สมบูรณ์ด้านล่างแสดงการดำเนินงานที่เป็นไปได้สำหรับ ด้วยรหัสนี้การแตะที่ViewController
มุมมองย่อยของมุมมอง (รวมถึงimageView
) จะไม่เรียกใช้printHello(_:)
เมธอด
import UIKit
class ViewController: UIViewController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printHello))
tapGestureRecognizer.delegate = self
view.addGestureRecognizer(tapGestureRecognizer)
let imageView = UIImageView(image: UIImage(named: "icon")!)
imageView.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
view.addSubview(imageView)
imageView.isUserInteractionEnabled = true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let touchedView = touch.view, let gestureView = gestureRecognizer.view, touchedView.isDescendant(of: gestureView), touchedView !== gestureView {
return false
}
return true
}
@objc func printHello(_ sender: UITapGestureRecognizer) {
print("Hello")
}
}
การใช้งานทางเลือกgestureRecognizer(_:shouldReceive:)
สามารถ:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return gestureRecognizer.view === touch.view
}
อย่างไรก็ตามโปรดทราบว่ารหัสทางเลือกนี้ไม่ได้ตรวจสอบว่าtouch.view
เป็นมุมมองย่อยของgestureRecognizer.view
.