传播特定的触摸事件以在下面查看

Posted

技术标签:

【中文标题】传播特定的触摸事件以在下面查看【英文标题】:Propagating specific touch event to view underneath 【发布时间】:2016-11-04 04:32:03 【问题描述】:

我想实现一个类似这样的功能:

View A 和 View B 都是同一个父 UIView 的子视图。视图 A 和视图 B 是同级视图。视图 A 的帧大小与父视图相同。视图 B 只有一半大小,它在视图 A 上方。我想在视图 B 上捕获滑动事件/手势,但仍将其他事件/手势(例如点击)从视图 B 传播到视图 A。因此用户仍然可以与视图 A(例如点击视图 A 上的按钮),而视图 B 仅捕获滑动手势。

我已经尝试在视图 B 上实现以下方法

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

但似乎这是全有或全无的方法。因为我无法在这些方法中检测到事件是点击还是滑动。而且我没有找到任何可以以编程方式触发 UIView 上的点击的 API(不调用与触摸相关的方法)。

【问题讨论】:

检测不同类型的手势非常困难。为什么不使用手势识别器? @macmoonshine 我尝试了手势识别器,但似乎没有用。视图 B 和视图 A 是同级视图。我不知道如何将手势事件从视图 B 传递到视图 A,因为视图 ​​B 位于视图 A 之上。 您可以将识别器添加到一个通用的superview中。 【参考方案1】:

您应该将您的后兄弟视图移动为前视图的子视图,因为这个效果看起来相同,但会使 UIResponder 链正常运行。 UIGestureRecognizer 可以为您完成剩下的工作。具体来说,它有一个属性,CancelsTocuhesInViews,你可以关闭它,这样它就不会吃触摸事件,它有一个委托,它的方法可以让你指定 UIGestureRegonizer 应该触发的条件。实现你想让你的逻辑工作的UIGestureRecognizerDelegate 方法。例如,如果您希望覆盖视图仅在一堆其他手势识别器不首先处理点击时才处理点击,那么您实现 gestureRecognizer(_:shouldRequireFailureOf:) 并让它为您想要首先使用的每个其他手势识别器返回 true;只有当所有其他手势识别器都无法处理点击时,您的手势识别器才会触发。

【讨论】:

【参考方案2】:

如果我理解正确的话,你想要做的通常是使用 UIGestureRecognizer 对象及其子类来完成。您可以使一个手势识别器(即滑动(或平移?)手势识别器)依赖于另一个手势识别器(一个用于点击)。

您可以告诉一个手势识别器仅在另一个手势识别器未能检测到其手势时触发。我还没有这样做,所以不能给你更多细节,但我会研究这些类,看看是否有办法链接它们以便它处理滑动,只是 没有 处理水龙头。我认为,如果您不处理水龙头,它应该会自动转到可以处理它的任何子视图。

【讨论】:

感谢您的建议。这里的问题是视图 A 和视图 B 是同级视图,它们是同一父视图的子视图。我尝试了 UIGestureRecognizer 方法。我可以处理视图 B 上的滑动手势。但是如何将视图 B 上发生的点击手势传递给视图 A,因为视图 ​​B 始终位于视图 A 之上,这会阻止所有用户交互。 您可以更改视图的顺序吗?另外,不确定这是否会破坏层次结构的清洁度,但是您可以在父视图上安装手势识别器,然后反过来吗?如果检测到平移手势,则将平移传递给视图,否则告诉视图从其 hitTest(_:withEvent:) 方法返回 NO?

以上是关于传播特定的触摸事件以在下面查看的主要内容,如果未能解决你的问题,请参考以下文章

Chrome App webview 和触摸滚动传播

SKView bounds.size 在触摸事件时反转(Sprite Kit)

如何以编程方式将触摸事件伪造为 UIButton?

如何检测不同图像部分上的不同触摸事件

XIB-less iOS项目模板拒绝接收触摸事件

向 UIButton iPhone 添加特定的触摸事件