ios - 我将 UIGestureReconizer 添加到视图以检测 Touch Down 动作,但是视图上方的按钮将不再起作用
问题描述
我有一个需要在完整视图上检测“Touch Down”动作的视图,在我发现正常的 UITapGestureRecognizer 无法完成它之后,我使用这个自定义 UIestureRecognizer 类来实现它。
所以它确实有效,但是我在视图上有几个按钮,在我可以检测到视图的 Touch Down 操作后,这些按钮停止工作。我需要他们两个工作,检测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
}
}
解决方案
您可以在 touchesBegan 中比较该事件的触摸视图与分配手势识别器的视图相同
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
}
}
推荐阅读
- javascript - React Native:在 FlatList 中调用 setState 比在 ScrollView 中调用 setState 慢得多
- performance - 如何解决 Jmeter 错误连接重置?
- r - 如何使用simsem包R创建数据分析模板(lavaan参数表)?
- javascript - 是否有 js 功能或 html 属性将文本格式化为输入区域?
- cordova - 对cordova插件中的npm包的依赖不起作用
- python - 使用来自 QFileDialog Python 的 openCV 读取图像
- ajax - 为什么jquery ajax post请求在yii2中出错?
- javascript - 使用 Javascript 从动态下拉列表中捕获选定的值
- angular - 从可观察的方法重定向到新页面
- python - Python:将 xml 解析为字典并仅过滤特定字段