ios - UIGestureRecognizer 识别订单问题
问题描述
我有一个红色视图和一个绿色视图(绿色视图是 redview 的子视图),并且我为它们中的每一个添加了一个gestureRecognizer。
并且 grestureRecognizer 都shouldRecognizeSimultaneouslyWith
返回 YES。
但是当我点击绿色视图时,首先调用了红色视图的手势委托方法shouldRecognizeSimultaneouslyWith
。
因为我认为命中测试视图应该是绿色视图。所以绿色视图shouldRecognizeSimultaneouslyWith
应该是第一个。
iOS 如何决定首先识别哪个 grestureRecognizer ?
发布代码并打印日志:
class GreenView: UIView,UIGestureRecognizerDelegate{
override func awakeFromNib() {
let gesture = UITapGestureRecognizer(target: self, action: #selector(greenTap))
gesture.delegate = self
self.addGestureRecognizer(gesture)
}
@objc func greenTap(){
print("greenTap")
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("greenTap shouldRecognizeSimultaneouslyWith")
return true
}
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
print("green gestureRecognizerShouldBegin")
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
}
class RedView: UIView,UIGestureRecognizerDelegate{
override func awakeFromNib() {
let gesture = UITapGestureRecognizer(target: self, action: #selector(redTap))
gesture.delegate = self
self.addGestureRecognizer(gesture)
}
@objc func redTap(){
print("redTap")
}
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
print("redTap gestureRecognizerShouldBegin")
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("redTap shouldRecognizeSimultaneouslyWith")
return true
}
}
和打印是:
green gestureRecognizerShouldBegin redTap gestureRecognizerShouldBegin green gestureRecognizerShouldBegin redTap shouldRecognizeSimultaneouslyWith greenTap shouldRecognizeSimultaneouslyWith redTap greenTap
我们可以看到 redview(superview) 的 shouldRecognizeSimultaneouslyWith 和 action 方法在 greenview(subview) 的方法之前被调用
解决方案
不要将绿色视图添加为红色视图的子视图。只需在其上方的红色视图之外添加绿色视图并将约束居中到红色视图
推荐阅读
- python - python中的ML模型类
- apache - 如何在 htaccess 重写规则中捕获 GET 变量
- mysql - 如何使用循环从文本字段中获取值
- html - 更改来自 html 中的外部链接的字体颜色
- javascript - 我如何使用 javascript 在 vue js 中进行过滤搜索
- javascript - 不要从服务层到组件返回可观察的值
- c# - Process.Start 不打开应用程序
- c - 在 IRQ 上的代码中添加或删除数据时崩溃
- elasticsearch - 如何将 fluentd 连接到 opendistro 以进行弹性搜索
- networking - 如何为三种不同的目的创建一个 Gitlab CICD 管道