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

iOS:将手势传递给下面的视图,ios,objective-c,uiview,uigesturerecognizer,Ios,Objective C,Uiview,Uigesturerecognizer,我有一个简单的设置:有两个兄弟UIViewsa和B,B完全覆盖a(但它是透明的,所以a是可见的): 我需要两个不同的uigesturecognizer:A应该有一个点击识别器,B应该有一个平移识别器。每当我点击B时,它应该将触摸事件传递给后面的A,以便它能够识别点击(我将使用一些逻辑来了解pan是否被接受,如距离、起始区域等)。这可以在iOS中实现吗 到目前为止,我的经验是,一旦B接受了一个触摸,它就永远不会将它转发给后面的a。并且应立即在重写的pointInside或hitTest函数中决定是

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

我需要两个不同的
uigesturecognizer
:A应该有一个点击识别器,B应该有一个平移识别器。每当我点击B时,它应该将触摸事件传递给后面的A,以便它能够识别点击(我将使用一些逻辑来了解pan是否被接受,如距离、起始区域等)。这可以在iOS中实现吗


到目前为止,我的经验是,一旦B接受了一个触摸,它就永远不会将它转发给后面的a。并且应立即在重写的
pointInside
hitTest
函数中决定是否接受。然而,在我的例子中,这个决定是基于一些逻辑,并且取决于用户交互的上下文和历史。

如果B覆盖了A,它将阻止A接收手势。但是为什么有透明的B而不是A呢?去掉B并将两个手势都放在A上。然后您可以定义轻触手势以要求平移手势失败。

根据
响应器链
它将事件转发到下一个视图(或下一个级别),如果它不是由顶部对象处理的,但如果它是由顶部对象处理的,则不会传递到下一个级别。因此,在您的情况下,如果视图B响应触摸事件,它将不会将触摸传递给视图A,但如果您在视图B中强制阻止触摸事件,则
响应器链将触摸事件传递给视图A

链接中有更多内容:


希望它能有所帮助

我发现了这个,将这个类添加到top view

@interface ClickthroughView : UIView
@end

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

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

根据响应器链,如果事件不是由顶部对象处理的,它会将事件转发到下一个视图(或下一级),但如果事件是由顶部对象处理的,则不会将其传递到下一级。因此,在您的情况下,如果视图B响应触摸事件,它将不会将触摸传递给视图A,但如果您在视图B中强制阻止触摸事件,则响应器链会将触摸事件传递给视图A。希望这有助于您是对的,但是,正如我所写的,在我的情况下,我无法立即阻止B中的触摸。我需要等待一点,得到一系列的触摸,明白这不是我需要的平底锅,然后说“好吧,我不需要这个,把它传给一个朋友”。iOS在将手势识别器添加到同一视图的情况下做到了这一点:它们同时工作,它们需要其他一些失败才能成功,等等。如果手势识别器连接到两个不同的重叠视图,我想这是不可能的。但在这种情况下,ClickthroughView将无法获得任何触动,这不是我所需要的。我想这就是我最终要做的。在我的例子中,A是一个复杂的视图,包含一堆视图、图像和按钮,这些视图、图像和按钮上有几个滑动、点击、双击识别器。我只是想在所有视图上添加一个平移功能(比如用手指从特定区域开始画一个提示做一些很酷的事情),不想弄乱现有的布局。所以我想首先添加一个视图,并在其中完成我的工作。但它会窃取一切,事件不会到达下面的视图。
@interface ClickthroughView : UIView
@end

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