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。接受或不接受的决定应立即在覆盖的pointInsidehitTest 函数中完成。然而,在我的例子中,这个决定是基于一些逻辑的,并且取决于用户交互的上下文和历史。

【问题讨论】:

根据响应者链,它会将事件转发到下一个视图(或下一个级别),如果它没有被顶部对象处理,但如果它被顶部对象处理,那么它不会通过到下一个层次。因此,在您的情况下,如果视图 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:将手势传递给下面的视图的主要内容,如果未能解决你的问题,请参考以下文章

将触摸传递给下的视图

锁定用户与WKWebView的交互

如何将变量传递给下一个视图?

将变量传递给下一个视图控制器

将点击事件传递给子视图 iOS

Django:将会话信息传递给下一个模板和视图