iOS:将手势传递给下面的视图

iOS: pass gesture to views underneath

我有一个简单的设置:有2个兄弟UIViews A和B,B完全覆盖A(但它是透明的,所以A是可见的):

┌──────────────────┐
│   View A         │
│                  │
│   ┌──────────────┴───┐
│   │   View B         │
│   │                  │
│   │                  │
│   │                  │
│   │                  │
│   │                  │
└───┤                  │
    │                  │
    │                  │
    └──────────────────┘

我需要 2 个不同的 UIGestureRecognizers:A 应该有一个敲击识别器,B 应该有一个平移识别器。每当我点击 B 时,它应该将触摸事件传递给后面的视图 A,以便它可以识别点击(我将使用一些逻辑来了解平移是否被接受,例如距离、开始区域等)。这可以在 iOS 中完成吗?

我目前的经验是,一旦 B 接受了触摸,它就永远不会将它转发给落后的 A。接受或不接受的决定应该在覆盖的 pointInsidehitTest 函数中立即完成。然而,在我的例子中,决定是基于一些逻辑并且取决于用户交互的上下文和历史。

如果B盖住A,就会阻止A接收手势。但是为什么你在 A 上有这个透明的 B?把 B 去掉,把两个手势都放在 A 上。然后你可以定义点击手势来要求平移手势失败。

根据Responder Chain它将事件转发到下一个视图(或下一个级别),如果它没有被顶级对象处理,但如果它被顶级对象处理那么它不会通过到一个新的水平。因此,在您的情况下,如果视图 B 正在响应触摸事件,它不会将触摸传递给视图 A,但是如果您强行阻止视图 B 中的触摸事件,那么 Responder Chain 会将触摸事件传递给视图 A。

更多内容在 link 中:enter link description here

希望对您有所帮助

我找到了这个 class 添加到顶部视图

@interface ClickthroughView : UIView
@end

@implementation ClickthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return NO;
}
@end

为 A 和 B 添加 Tap 识别器。然后您可以使用您需要的任何逻辑来消除 B 中 Tap 和平移的歧义。您的 Tap 处理程序可以使用 gesture.view 来查看它是来自 A 还是 B,并在任何一种情况下将触摸转换为 A 坐标。