我有以下情况。 parentView
有它自己的gestureRecognizerA
and有一个子视图subView
有它自己的UITapGestureRecognizer
。有没有办法告诉parentView
,如果这些触摸事件在gestureRecognizerA
的界限,它应该将subView
中识别的触摸事件传递给subView
?
gestureRecognizerA
非常具体。它是一种用于识别环形运动的自定义手势识别器。这种认识应该发生在parentView
的所有领域。但是,当相同的手势识别器识别出水龙头时,它应该将该水龙头传递给subView
。
您可以轻松识别点击点。例如,您在父类中有一个轻击手势:
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
}
在点击方法内部,您可以识别点击发生的位置,因此在检查子视图的边界与点击位置后,您可以验证是否在子视图范围内发生了点击。
看起来你只想让这两个手势识别器同时工作。只需为你的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
,你仍然拥有几乎所有的信息来解决那里的点击手势。