我有一个视图需要在整个视图上检测“ Touch Down”动作,在发现普通的UITapGestureRecognizer无法完成此操作之后,我自定义UIestureRecognizer类来实现它,using this。
它确实可以工作,但是我在视图上有几个按钮,在我可以检测到视图的“ Touch Down”操作后,这些按钮停止工作。 我需要他们两个都工作,可以检测到“触地”的视图,并且可以在视图上方按下按钮。我该如何实现?
为清楚起见,这些按钮仅需要检测正常的Touch Up Inside动作,仅视图需要检测Touch Down动作。另外,当按钮上发生触摸事件时,视图不需要对触摸事件做出反应。
谢谢。
import UIKit
import UIKit.UIGestureRecognizerSubclass
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let t = SingleTouchDownGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
self.view.addGestureRecognizer(t)
}
@objc func handleTap(sender: UITapGestureRecognizer? = nil) {
self.view.backgroundColor = #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)
UIView.animate(withDuration: 1) {
self.view.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
}
}
@IBAction func testBtnPressed(_ sender: Any) {
print("testBtnPressed!")
}
}
class SingleTouchDownGestureRecognizer: UIGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
if self.state == .possible {
self.state = .recognized
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
self.state = .failed
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
self.state = .failed
}
}
答案 0 :(得分:1)
您可以在触摸中比较该事件开始触摸的视图与为手势识别器分配的视图相同
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
guard let view = self.view else { return }
guard let touches = event.touches(for: view) else { return }
super.touchesBegan(touches, with: event)
if self.state == .possible {
self.state = .recognized
}
}