iOS:将手势传递给下面的视图
Posted
技术标签:
【中文标题】iOS:将手势传递给下面的视图【英文标题】:iOS: pass gesture to views underneath 【发布时间】:2016-09-17 00:37:01 【问题描述】:我有一个简单的设置:有 2 个兄弟UIViews
A 和 B,B 完全覆盖 A(但它是透明的,所以 A 是可见的):
┌──────────────────┐
│ View A │
│ │
│ ┌──────────────┴───┐
│ │ View B │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
└───┤ │
│ │
│ │
└──────────────────┘
我需要 2 个不同的 UIGestureRecognizers
:A 应该有一个水龙头识别器,B 应该有一个平移识别器。每当我点击 B 时,它应该传递触摸事件以查看 A 后面,以便它可以识别点击(我将使用一些逻辑来了解是否接受平移,如距离、起始区域等)。这可以在 ios 中实现吗?
到目前为止,我的经验是,一旦 B 接受触摸,它就永远不会将其转发给后面的 A。接受或不接受的决定应立即在覆盖的pointInside
或hitTest
函数中完成。然而,在我的例子中,这个决定是基于一些逻辑的,并且取决于用户交互的上下文和历史。
【问题讨论】:
根据响应者链,它会将事件转发到下一个视图(或下一个级别),如果它没有被顶部对象处理,但如果它被顶部对象处理,那么它不会通过到下一个层次。因此,在您的情况下,如果视图 B 正在响应触摸事件,它不会将触摸传递给视图 A,但是如果您在视图 B 中强行阻止触摸事件,则响应者链会将触摸事件传递给视图 A。希望对您有所帮助 【参考方案1】:如果 B 覆盖 A,它将阻止 A 接收手势。但是为什么你有这个透明的 B over A?摆脱 B 并将两个手势放在 A 上。然后您可以定义点击手势以要求平移手势失败。
【讨论】:
我想这就是我最终要做的。在我的例子中,A 是一个复杂的视图,包含一堆视图、图像、按钮,上面有几个滑动、点击、双击识别器。我只是想在所有视图上添加一个平移功能(比如用手指从特定区域开始绘制提示会很酷)并且不想弄乱现有的布局。所以我想首先添加一个视图并在其中做我的事情。但是随后它窃取了所有内容,并且事件没有到达下面的视图。【参考方案2】:根据Responder Chain
,它会将事件转发到下一个视图(或下一级),如果它不是由顶层对象处理,但如果它是由顶层对象处理,那么它不会将它传递到下一层.因此,在您的情况下,如果视图 B 响应触摸事件,它不会将触摸传递给视图 A,但是如果您在视图 B 中强行阻止触摸事件,则 Responder Chain
会将触摸事件传递给视图 A。
更多内容在链接中:enter link description here
希望对你有帮助
【讨论】:
你是对的,但是,正如我所写的,就我而言,我无法立即阻止 B 中的触摸。我需要等一下,多摸几下,明白这不是我需要的平底锅,然后说“好吧,我不需要这个,把它传给 A”。 iOS 会在手势识别器添加到同一个视图的情况下完成这一切:它们同时工作,它们需要其他一些失败才能成功,等等。我想如果手势识别器附加到 2 个不同的重叠视图,这是无法做到的。【参考方案3】:我发现这个把这个类添加到顶视图
@interface ClickthroughView : UIView
@end
@implementation ClickthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
return NO;
@end
【讨论】:
但在这种情况下,ClickthroughView 根本不会有任何接触,这不是我需要的。【参考方案4】:为 A 和 B 添加一个 Tap 识别器。然后您可以使用任何您需要的逻辑来消除 B 中的 Tap 和 Pan 的歧义。您的 Tap 处理程序可以使用 gesture.view 来查看它是来自 A 还是 B,并在任何一种情况下都将触摸转换为 A 坐标。
【讨论】:
以上是关于iOS:将手势传递给下面的视图的主要内容,如果未能解决你的问题,请参考以下文章