我有以下情况。 parentView
有自己的gestureRecognizerA
,并有一个子视图subView
,它有自己的UITapGestureRecognizer
。
是否有任何方法告诉parentView
,如果这些触摸事件在gestureRecognizerA
的范围内,则应将subView
中识别的触摸事件传递给subView
?
gestureRecognizerA
非常具体。它是用于识别圆周运动的自定义手势识别器。这种认识应该发生在parentView
的所有领域。但是,当同一个手势识别器识别出轻敲时,应将该轻敲传递给subView
。
答案 0 :(得分:2)
您可以轻松识别出点击点。 例如,您在父类中有一个轻击手势,如下所示:
let tapGR = UITapGestureRecognizer(target: self, action: #selector(tapped))
view.addGestureRecognizer(tapGR)
@objc func tapped(gr:UITapGestureRecognizer) {
let loc:CGPoint = gr.location(in: gr.view)
//insert your touch based code here
}
在点击方法中,您可以识别点击发生的位置,因此在用点击的位置检查子视图的边界之后,您可以验证点击是否发生在子视图的边界内。
答案 1 :(得分:1)
似乎您只希望两个手势识别器同时工作。只需为您的UIGestureRecognizerDelegate
实现parentView
并使其成为tapGestureRecognizer
和gestureRecognizerA
的委托即可。然后在那里实现一个可选方法:
// MARK: - UIGestureRecognizerDelegate
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) {
return true
}
即使在subView
内做圆周运动,它也可能能够检测到parentView
中的敲击。
更新:使用手势识别器时,“转发触摸”将只是调用另一个识别器的方法。只需将正在执行转发的识别器作为其参数即可。
例如,tapGestureRecognizer
在检测到轻击时触发viewWasTapped(_ sender: UITapGestureRecognizer)
。现在,当您的gestureRecognizerA
想要将其事件转发到tapGestureRecognizer
时,只需调用以下方法即可
subView.viewWasTapped(self.gestureRecognizerA)
对方法本身进行了明显的更改:
func viewWasTapped(_ sender: UIGestureRecognizer) {
// ...
}
这适用于UITapGestureRecognizer
。发件人可以是任何其他UIGestureRecognizer
,并且您仍然可以获得在其中解决轻击手势的几乎所有信息。