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

问题描述 投票:0回答:5

我有一个简单的设置:有2个兄弟

UIViews
A和B,B完全覆盖A(但它是透明的,所以A是可见的):

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

我需要 2 个不同的

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

到目前为止,我的经验是,一旦 B 接受了触摸,它就永远不会将其转发给后面的 A。并且应立即在覆盖的

pointInside
hitTest
函数中做出接受或不接受的决定。然而,就我而言,该决定基于某种逻辑,并且取决于用户交互的上下文和历史。

ios objective-c uiview uigesturerecognizer
5个回答
1
投票

根据

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

更多内容在链接中:在此处输入链接描述

希望有帮助


0
投票

如果B覆盖了A,就会阻止A接收手势。但为什么 B 比 A 更透明呢?去掉 B 并将两个手势都放在 A 上。然后您可以定义点击手势以要求平移手势失败。


0
投票

我发现这个将此类添加到顶视图

@interface ClickthroughView : UIView
@end

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

0
投票

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


0
投票

通过将

isUserInteractionEnabled
设置为
false
上的
view B
,它将用户交互传递给
view A

© www.soinside.com 2019 - 2024. All rights reserved.