可以将事件/手势传递给所有子视图吗?

时间:2014-02-22 20:55:15

标签: ios uiview mkmapview mapbox route-me

我正在尝试一个快速的原型项目,看看我想用Mapbox iOS SDK(route-me)和iOS MapKit做些什么。

我想看看我是否可以利用MapBox的离线功能(以及群集等附加功能)获得两全其美,但仍然使用iOS地图类型。经过一些研究(以及对SO的帮助),我发现Mapbox和iOS地图不能一起工作,你可以选择其中一个。我开始想知道如果我在iOS地图上放置一个RMMapView(mapbox map)目录会发生什么。然后,在我想要查看iOS地图的情况下,我可以将RMMapViews底图设置为透明,以便直接在其下方的iOS地图显示出来。再两次,您可以使用iOS地图,但我也可以保留绘制的地图框标记,这样当您切换到iOS地图时,您无需重新绘制标记。

enter image description here

基本上我创建了一个主视图(Super View)并添加了两个子视图(MKMapView和RMMapView),顶部是RMMapView。我已经想出如何使RMMapView上的基础层透明,我甚至可以添加RMMarkers,它们很好地放置在MKMapView之上。

我的问题在于触摸事件和手势。如果我这样做,我需要在RMMapView上发生的所有触摸和手势,仍然发生在RMMapView上,但也发生在MKMapView上。 I.E.如果RMMapView上的基本地图是透明的,但该视图中有一个标记,当我滚动地图时,我需要RMMapView移动(使标记移动)以及MKMapView。

我尝试过:

  1. 覆盖hitTest。这种方法的问题在于,一旦执行此操作,触摸将仅对您返回的视图进行操作。我需要在RMMapView和MKMapView上进行触摸。
  2. 在我的超级视图中创建了一个手势识别器。然后我尝试将触摸传递给我的两个子视图。真的,这确实可行。但是我可以说出一些问题。首先我知道两个地图视图都有滚动视图,因此将触摸转发到MKMapView和RMMapView不起作用。我想我必须将触摸转发到每个地图滚动视图。
  3. 所以我不认为1会工作,我不能让2工作。任何人都试图做这样的事情。 2个不同的视图可以对相同的触摸事件进行操作,还是可以获得事件获胜的第一个视图?

    我的设计也可能出错,如果有人有其他建议,请将其丢弃。虽然我想要远离修改RMMapView,并且无法真正修改MKMapView。

    我能找到的最相关的帖子是:How to intercept touches events on a MKMapView or UIWebView objects?。但是我不想拦截MKMapView上的事件,我想在SuperView上拦截它们,这样我就可以传递给它的视图。

    由于

2 个答案:

答案 0 :(得分:0)

我不确定是否完全理解您的需求,但触摸事件会自动沿响应链传播。 如果你想处理它,你只需要覆盖这些方法

– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
– touchesCancelled:withEvent:

并在您的实施中调用[super touchesBegan ..]。

UIResponder类参考文档中对此进行了解释:

  

讨论此方法的默认实现不执行任何操作。   但是尤其是UIR应答器的UIKit子类   UIView,将消息转发到响应者链。转发   消息发送到下一个响应者,将消息发送到超级(   超类实现);不要直接发送消息到   下一个响应者。例如,

     

[super touchesBegan:touches withEvent:event];

这就是你需要的吗?

答案 1 :(得分:0)

我是Mapbox iOS SDK的维护者(即RMMapView部分)。

我没有试过这个,但您可以尝试在一侧或另一侧使用区域/中心/缩放更改委托方法来驱动对方地图的更新。我可能首先尝试使用Mapbox -> MapKit,因为Mapbox具有更细粒度的回调。

我要尝试的另一件事是使用GCD来dispatch_async()这些调用,以便不占用委托回调。

这种做法可能完全是不明智的,但我想我会把它丢掉。

我认为你在共享触摸事件方面没有太多运气。