我有一个简单的设置:有2个兄弟
UIViews
A和B,B完全覆盖A(但它是透明的,所以A是可见的):
┌──────────────────┐
│ View A │
│ │
│ ┌──────────────┴───┐
│ │ View B │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
└───┤ │
│ │
│ │
└──────────────────┘
我需要 2 个不同的
UIGestureRecognizers
:A 应该有一个点击识别器,B 应该有一个平移识别器。每当我点击 B 时,它都应该将触摸事件传递给后面的视图 A,以便它可以识别点击(我将使用一些逻辑来了解平移是否被接受,例如距离、起始区域等)。这可以在 iOS 中实现吗?
到目前为止,我的经验是,一旦 B 接受了触摸,它就永远不会将其转发给后面的 A。并且应立即在覆盖的
pointInside
或 hitTest
函数中做出接受或不接受的决定。然而,就我而言,该决定基于某种逻辑,并且取决于用户交互的上下文和历史。
根据
Responder Chain
,如果事件不是由顶部对象处理的,它会将事件转发到下一个视图(或下一个级别),但如果它是由顶部对象处理的,那么它不会将其传递到下一个级别。因此,在您的情况下,如果视图 B 响应触摸事件,它不会将触摸传递给视图 A,但是如果您强制阻止视图 B 中的触摸事件,则 Responder Chain
将触摸事件传递给视图 A。
更多内容在链接中:在此处输入链接描述
希望有帮助
如果B覆盖了A,就会阻止A接收手势。但为什么 B 比 A 更透明呢?去掉 B 并将两个手势都放在 A 上。然后您可以定义点击手势以要求平移手势失败。
我发现这个将此类添加到顶视图
@interface ClickthroughView : UIView
@end
@implementation ClickthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return NO;
}
@end
为 A 和 B 添加 Tap 识别器。然后您可以使用您需要的任何逻辑来消除 B 中的 Tap 和平移的歧义。您的点击处理程序可以使用gesture.view来查看它是来自A还是B,并在任一情况下将触摸转换为A坐标。
通过将
isUserInteractionEnabled
设置为 false
上的 view B
,它将用户交互传递给 view A
。