【发布时间】:2019-11-22 17:24:54
【问题描述】:
我有一个红色视图和一个绿色视图(绿色视图是 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) 的方法之前被调用
【问题讨论】:
-
应该为两个视图启用用户交互。所以当绿色视图被点击的时候肯定会调用绿色视图的方法。
-
请发布您尝试过的代码。
-
感谢@Mahendra,我已经添加了代码和日志,您可以看到 redview(superview) 的 shouldRecognizeSimultaneouslyWith 和 action 方法在 greenview(subview) 的方法之前被调用
标签: ios uikit uigesturerecognizer