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

问题描述 投票:-1回答:2

我有以下情况。 parentView有它自己的gestureRecognizerAand有一个子视图subView有它自己的UITapGestureRecognizer。有没有办法告诉parentView,如果这些触摸事件在gestureRecognizerA的界限,它应该将subView中识别的触摸事件传递给subView

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

enter image description here

ios swift uigesturerecognizer subview uitapgesturerecognizer
2个回答
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
投票

看起来你只想让这两个手势识别器同时工作。只需为你的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,你仍然拥有几乎所有的信息来解决那里的点击手势。

© www.soinside.com 2019 - 2024. All rights reserved.