iOS - 过滤和转发触摸到子视图

Posted

技术标签:

【中文标题】iOS - 过滤和转发触摸到子视图【英文标题】:iOS - Filtering and forwarding touches to subviews 【发布时间】:2014-10-29 18:47:50 【问题描述】:

我正在构建的应用程序有一个全屏MKMapView,并在其上放置了另一个UIView 子类,也是全屏且完全透明的。我希望UIView 子类处理单点触摸手势,例如点击和单指拖动,并忽略其他任何内容。这将允许MKMapView 使用其他方式进行交互,尤其是通过禁用 3D 功能用两根手指进行平移/滚动。

我的问题是 MKMapView 不使用touchesXXX:withEvent: 方法进行用户交互。因此,我无法在视图上的这些方法中检测到触摸计数并转发到地图。同样,hitTest:withEvent: 方法不能用于确定哪个视图处理触摸,因为那里的 UIEvent 对象返回一个空的触摸集。

我考虑过让所有触摸都通过视图向前并使用手势识别器来处理事件,但我确实需要覆盖视图上的单点触摸/拖动对地图视图没有影响。

有没有办法根据触摸次数来完成这种过滤?或者一种禁用地图视图上的单点触控手势的方法?

【问题讨论】:

如果您将单指点击并拖动识别器到地图视图本身,它是否有效? 所以基本上通过替换它们来覆盖/取消地图视图上的现有手势? 是的。一秒钟,我在 Xcode 中查看这个。 我也试过了,似乎没有效果.. 从未调用过手势(似乎地图视图的识别器先吞下了手势) 我也是。甚至将它们设置在父视图上。 【参考方案1】:

解决这个问题其实很简单。

为地图视图提供一个完全填充的父视图 将父视图平移和点击手势识别器配置为仅响应一根手指的触摸 在MKMapView 上,将scrollEnabled 属性设置为NO(IB 中的“允许滚动”复选框)

手势识别器允许您获取手势,并将 scrollEnabled 设置为 NO 可防止 MapView 吞下平移手势。

此处的示例项目:https://github.com/Linux-cpp-lisp/sample-no-gesture-mapview

【讨论】:

非常好。我喜欢它,它是如此接近。这只是引入了一个问题 - 当您禁用地图的 3D 功能时,两指手势允许滚动地图视图,这正是我想要做的(我想我应该指定我道歉) .现在不幸的是,禁用滚动以吞下单点触摸手势不允许两指平移:( 我目前正在按照这些思路测试一堆,以提出一些允许使用手势实现此功能的状态。它必须是可能的。我认为你走在正确的道路上,谢谢! @bgoers:当然。您可以尝试的一件事是通过捕获两个手指平移并计算偏移量来自己进行滚动。不过不太清楚该怎么做。 那是我最后的计划,如果转发/取消手势我无能为力:) @bgoers:查看MKMapView 文档的this 部分。将当前区域转换为矩形,将矩形平移平移,将该矩形转换回区域,并将其设置为地图区域,这可能并不难。

以上是关于iOS - 过滤和转发触摸到子视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS 不会将触摸转发到以下视图

iOS:如何将触摸事件从子视图转发到超级视图? [复制]

UIButton在添加到子视图时没有收到触摸,但在添加到主视图时会收到

iOS触摸事件处理详解

仅将触摸事件转发到被触摸的视图

从 UIScrollView 转发触摸 - UIButton 问题