什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?

Posted

技术标签:

【中文标题】什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?【英文标题】:What Condition Would Cause UITapGestureRecognizer to Fail but touchesBegan to Succeed? 【发布时间】:2014-06-10 22:43:37 【问题描述】:

考虑以下代码:

@interface TouchDownGestureRecognizer : UIGestureRecognizer
@end

@implementation TouchDownGestureRecognizer
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"touchesBegan");


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"touchesMoved");


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"touchesEnded");


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"touchesCancelled");

@end

在派生自 UIView 的类的构造函数中

- (id)initWithFrame:(CGRect)frame

    <snip>

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [tapRecognizer setDelegate:self];
    [self addGestureRecognizer:tapRecognizer];

    TouchDownGestureRecognizer *touchDownRecognizer = [[TouchDownGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchDown:)];
    [self addGestureRecognizer:touchDownRecognizer];

    <snip>

这个类的一个对象被添加到一个父视图中,并且在大多数情况下,点击子视图会导致 touchesBegan、touchesEnded 和 handleTap 被调用。在某些情况下(我无法确定),handleTap 停止为子视图调用,(而是调用父级的 handleTap)。然而,即使handleTap 停止被调用,touchesBegan 和touchedEnded 继续被调用子视图。我确保 UITapGestureRecognizer 仍在子视图的 gestureRecognizers 数组中。我还确保子视图的 userInteractionEnabled 属性为 YES。 UIView 是否有一些已知的条件或状态,我们会期望这种行为?

【问题讨论】:

似乎与***.com/questions/19095165/…中的问题相同。 【参考方案1】:

因此,如果我理解正确,在某些时候子视图的父级 UITapGestureRecognizer 将其称为“handleTap”选择器。当您在子视图的边界之外点击时,可能会发生这种情况。 UIView 的边界与它的框架不同,它的边界决定了 UIView 接收触摸事件的位置,而框架决定了内容的绘制位置。 UIView 的边界独立于其框架,因此即使您在子视图的框架内,您也有可能接触到父级。

问题是,如果是这种情况,我不认为子视图的 touchesBegan 和 touchesEnded 会被调用,但如果您还没有检查过,它是一个开始的地方。也许 GestureRecognizer 仍然接收到该事件,因为它在视图的层次结构中(想想它冒泡),但由于它不负责该事件,它不会调用 handleTap ......但这超出了我的范围和理解范围。

【讨论】:

以上是关于什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 (null || !TryParse) 条件会导致“使用未分配的局部变量”?

为啥“删除”这个无锁堆栈类中的节点会导致竞争条件?

为什么用cycle()创建的迭代器中的可变值没有更新,即使有停止条件,也会导致无限循环?

mysql 避免索引失效

有些 where 条件会导致索引无效

有条件地调用 useQuery 会导致构建失败