【问题标题】:Why does this UITapGestureRecognizer not recognize taps?为什么这个 UITapGestureRecognizer 不能识别水龙头?
【发布时间】:2014-01-02 16:12:30
【问题描述】:

我在使用 UITapGestureRecognizer 时遇到了一点问题。我是这样创建的:

self.userInteractionEnabled = YES;

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapRecognizer.cancelsTouchesInView = NO;
tapRecognizer.delaysTouchesBegan = YES;
tapRecognizer.delegate = self;
tapRecognizer.numberOfTapsRequired = 1;
tapRecognizer.numberOfTouchesRequired = 1;
[self addGestureRecognizer:tapRecognizer];

在头文件中,我还包含并实现shouldReceiveTouch: 方法,如下所示:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

我查看了无数有类似问题的人的帖子,但似乎找不到解决方案。我听说如果您要添加手势识别器的视图具有将userInteractionEnabled 设置为 YES 的子视图,则可能会干扰点击识别,因此我还包括以下内容:

for(UIView *subview in self.subviews) {
    subview.userInteractionEnabled = NO;
}

有人知道为什么手势识别器不起作用吗?


编辑:

这里有一些细节:

  • 我正在将 UITapGestureRecognizer 添加到 UIView 子类中。
  • 我在子类的initWithFrame: 方法中添加了手势识别器。
  • 我已经通过单步执行实际添加的代码部分验证了手势识别器正在被添加。
  • 包含此视图的视图控制器没有附加任何手势识别器,但实现了touchesBegantouchesMovedtouchesEnded。但是,根据这个question,视图控制器实现这些不应该影响视图的手势识别。


编辑2:

我已验证没有其他视图阻止手势识别器的视图接收触摸。我还验证了该视图实际上已添加到包含视图控制器的视图中。问题似乎出在其他地方。

【问题讨论】:

  • 此视图的父对象之一是否附加了手势识别器?
  • @BrianShamblen - 视图所在的视图控制器没有附加任何手势识别器,但它确实实现了 touchesBegan:touchesMoved:touchesEnded:
  • 你可以尝试将视图的背景颜色设置为红色吗?如果可以正常看到红色视图,请为层次结构中的所有视图设置背景颜色,然后您可以判断视图是否重叠

标签: ios iphone objective-c uigesturerecognizer uitapgesturerecognizer


【解决方案1】:

您的设置应该可以工作,所以我猜想发生两件事之一。您可能忘记了将这个视图实际添加到 ViewController 的视图中,或者可能在这个视图之上放置了另一个视图,它正在窃取触摸?

【讨论】:

  • +1 用于偷窃 - 我已经遇到过好几次了;您认为当前视图之上的视图不会妨碍您,但确实如此。仔细检查层次结构中可能高于此视图的任何内容。
  • 嗯。我已经验证我实际上是在将视图添加到视图控制器的视图中。我会试着看看上面有没有东西。
  • 它上面似乎没有任何东西。我遍历了所有视图控制器的视图子视图并记录了所有相交的子视图(结果只有一个)。然后我通过调用insertView:aboveSubview: 将视图移到该子视图上方,并通过在视图上调用bringSubviewToFront: 来仔细检查它。毕竟,点击手势识别器似乎仍然不起作用。
  • 理论上你仍然可以在有问题的视图之上看到一个视图。要查看视图层次结构(带框架)的打印输出,您可以暂停应用程序的执行并将其粘贴到控制台中: po [[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] recursiveDescription]
  • 你是对的。有一道风景覆盖了整个屏幕。删除它解决了问题。谢谢!
【解决方案2】:

导致问题的另一种可能是添加了 UITapGestureRecognizer 的视图不够大,因此当您点击屏幕时,触摸点不在视图的边界内。

【讨论】:

    【解决方案3】:

    还要确保 UIView 不透明。将背景颜色设置为例如黑色的。这解决了我的问题。

    【讨论】:

    • 如果 UIView 的 alpha 值设置为 0(在 Interface Builder 或代码中),手势识别器将不会触发。但只要 alpha 不为零,即使背景颜色设置为“清晰”,识别器也会起作用。有助于使屏幕的更大区域响应点击/其他手势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多