使 UITapGestureRecognizer 不消耗与视图无关的点击

Posted

技术标签:

【中文标题】使 UITapGestureRecognizer 不消耗与视图无关的点击【英文标题】:Make a UITapGestureRecognizer not consume taps that are not relevant to a view 【发布时间】:2017-02-18 21:15:04 【问题描述】:

我在视图上设置了 UITapGestureRecognizer。只有视图中的特定区域需要触发视图的行为。我通过检查触摸的确切位置是否在视图中的实际可操作区域来做到这一点。如果触摸不在这些区域,我希望点击在视图层次结构中向上传播。

我尝试使用手势委托:shouldReceive touch,并在那里测试触摸是否与视图相关,但我无法在那里执行操作,因为它在触摸时触发,而不是在点击时触发。我可以在 shouldReceive 中执行相关性测试,并且只有当点击动作处理程序被调用时才执行该动作,但我觉得这很尴尬。有没有更优雅的方式告诉 ios 我的手势识别器决定不使用点击?

【问题讨论】:

可以分享一些相关代码吗?应该触发轻击手势的特定区域是否与其他视图类型不同? 在实践中,我处理的视图是一个带有属性字符串的 UITextView,其中只有部分标记有自定义点击操作。所以在我的行动中,我首先测试水龙头是否接触到任何这些区域,如果没有,什么都不做(最好不要消耗水龙头)。 哇!如果使用gestureRecognizer: shouldReceiveRouch 涉及多个视图,那将是正确的方法。但是对于属性字符串,对于非平凡的用例,您应该依赖 Text Kit。不看任何代码,我只能建议检查这个特定的答案,这会有所帮助:***.com/a/28519273/3339346 谢谢@ystack。幸运的是,我的属性字符串水龙头处理程序工作正常,并正确检测水龙头的位置。唯一的问题是当我的处理程序发现点击与文本无关时如何告诉 iOS。您的链接不包含在内。 你能不使用简单的if-else 围绕手势位置点进行视图计算来实现这一点吗? 【参考方案1】:

根据我们的讨论,您可以评估使用if-else签入属性字符串触摸处理程序和gestureRecognizer:shouldReceiveTouch:的组合

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

    if ([touch.view isDescendantOfView:interestingView]) 
        return NO;
    
    return YES;       

希望这会有所帮助。如果没有,那我再重申一遍,你最好能分享一些相关的代码。

【讨论】:

正如我所解释的 - 这是我已经拥有的,但发现拆分测试部分和动作触发很麻烦和尴尬。我正在点击本身的手势动作处理程序中寻找解决方案。 是的,我知道 ^this 会变得丑陋。也许,您可以考虑将您的视图从层次结构中分离出来。不要在需要以不同方式处理手势的视图之间创建 父子 视图层次结构。或者,有一个手势处理 router,它确定手势的位置并调用独立的手势处理程序,每个处理程序对于任何数据都没有依赖关系。

以上是关于使 UITapGestureRecognizer 不消耗与视图无关的点击的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextView 中使图像可点击

使多个运动图像响应点击

如何为 UIViewController.view 中也具有 UITapGestureRecognizer 的 UIView 挑选和操作 UITapGestureRecognizer?

UITapGestureRecognizer 不适用于 UIView 动画

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误