如何在父视图中使用手势识别器快速将触摸传递到子视图

时间:2019-03-04 10:16:29

标签: ios swift uigesturerecognizer subview uitapgesturerecognizer

我有以下情况。 parentView有自己的gestureRecognizerA,并有一个子视图subView,它有自己的UITapGestureRecognizer。 是否有任何方法告诉parentView,如果这些触摸事件在gestureRecognizerA的范围内,则应将subView中识别的触摸事件传递给subView

gestureRecognizerA非常具体。它是用于识别圆周运动的自定义手势识别器。这种认识应该发生在parentView的所有领域。但是,当同一个手势识别器识别出轻敲时,应将该轻敲传递给subView

enter image description here

2 个答案:

答案 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并使其成为tapGestureRecognizergestureRecognizerA的委托即可。然后在那里实现一个可选方法:

// 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,并且您仍然可以获得在其中解决轻击手势的几乎所有信息。