UITapGestureRecognizer 在 iOS9 上不起作用

Posted

技术标签:

【中文标题】UITapGestureRecognizer 在 iOS9 上不起作用【英文标题】:UITapGestureRecognizer not working on iOS9 【发布时间】:2015-06-25 11:25:51 【问题描述】:

我有一个使用 UITapGestureRecognizers 的应用程序,它似乎在 ios9 Beta 2 中不起作用。

他们调用成功了

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

  NSLog(@"shouldReceiveTouch");
  return YES;

但它不会影响任何其他 UITapGesture 委托方法。

当我在运行 iOS 8 的设备上运行相同的应用程序(来自 Xcode 7)时,它按预期工作。

还有其他人打过这个吗?

这是我如何初始化 UITapGestureRecognizer。

编辑 如果我在代码中而不是在 ViewController xib 中创建 UITapGestureRecognizer,它可以正常工作,所以在 iOS9 或其他东西中 xib 解析有问题。

_tapGesture2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMainViewTap:)];
_tapGesture2.numberOfTapsRequired = 1;
_tapGesture2.delegate = self;
[self.view addGestureRecognizer:_tapGesture2];

编辑2 如果我删除了 XIB 中的 GestureRecognizer 并使用 XCode 7 再次添加它,它也可以工作。 当我这样做时,它会将<pressTypeMask key="allowedPressTypes"/> 添加到 UITapGestureRecognizer 下的 xib 中。

【问题讨论】:

您是否将视图的属性“已启用用户交互”设置为“是”?也许视图没有正确处理触摸 它设置为 YES,但好主意:)。 我在应用程序中使用两个不同的 UITapGestureRecognizers 时遇到了同样的问题,它们在 iOS 8 中都可以正常工作。 另一点 - UISwipeGestureRecognizers 似乎工作正常。 可以确认这一点。我有一些旧的带有 IB 手势识别器的示例项目不起作用,只需在 .storyboard 文件中的条目中添加该晦涩的 <pressTypeMask key="allowedPressTypes"/> 行即可修复它们的行为。 【参考方案1】:

iOS9 似乎在手势识别器的 xml 中寻找 <pressTypeMask key="allowedPressTypes"/> 行,没有它,点击识别器就无法工作。 要解决此问题,您可以在代码中构建识别器,将该行添加到 xml 中,或者在 Xcode 7 中删除并重新添加手势识别器,这会正确地将 pressTypeMask 添加到 xml 中。

我想知道苹果是否会修复 iOS9 以在 XML 中没有该行的情况下工作,但目前,这是一个简单的修复。

【讨论】:

将此作为错误报告给 Apple。 你能告诉我更多你想在哪里插入 ,好吗? @Roman 我不知道如何在最新版本的 Xcode 上重现它。你有这方面的问题吗? @yerforkferchips,是的,我已将您运行 iOS 8 的项目更新为 iOS 9.2 (swift 2.1)。不工作 UITapGestureRecognizer。请帮帮我!如果您从头开始创建一个新项目,那么一切正常。 尝试移除点击手势并重新添加,然后比较 xml 的变化情况。或者,您可以通过编程方式创建点击手势。【参考方案2】:

我也遇到了这个问题,特别是当我试图让我的按钮和视图在表格单元格中使用点击手势来响应在 xib 中定义布局的点击时。在 iOS 8 和 10 上运行良好,但不是 9。实际问题是我将这些添加到自定义 uiview 并将视图的类分配给我的 UITableViewCell 子类,而不是在 IB 中使用 Table View Cell 对象。因此,我没有将我的子视图添加到 IB 对象给你的contentView,这导致了我的问题。修复方法是重做 xib 以使用表格视图单元作为我的根,这样我就可以将我的子视图附加到内容视图。

【讨论】:

【参考方案3】:

实现 UIGestureRecognizer 的所有可选委托都可以。

【讨论】:

【参考方案4】:

我通过 Xcode-7 beta 2 进行了检查

我已经使用手势识别器创建了 vc,并为属性和操作创建了出口。在 viewDidload 设置的委托中,像这样:

在调试期间调用的所有方法 - 我已标记//调用

我收到了下一个方法的事件:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 
    print("worked")
    // called
    return true


 func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool
 
    //called
    print("worked")
    return true



 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOfGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool
 
    print("worked")
    //called
    return true

尝试按照我提到的重新创建项目并检查您的所有网点并委托

希望对你有帮助

【讨论】:

我像你一样建立了一个简单的项目,看起来一切正常,但在我现有的应用程序中,它从未遇到任何其他委托方法,除了shouldReceiveTouch

以上是关于UITapGestureRecognizer 在 iOS9 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UITapGestureRecognizer 上添加参数

在 UITapGestureRecognizer 中更改字体

使用 UITapGestureRecognizer 无法识别的选择器

带有点击事件的 UITapGestureRecognizer

UITapGestureRecognizer 和 touchesBegan 用于相同的视图

UIButton 上的 UITapGestureRecognizer