2

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

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

在此处输入图像描述

基本上,我创建了一个主视图(超级视图)并添加了两个子视图(MKMapView 和 RMMapView),RMMapView 位于顶部。我已经想出了如何使 RMMapView 上的基础层透明,我什至可以添加 RMMarkers,它们很好地显示在 MKMapView 之上。

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

我试过的:

  1. 覆盖 hitTest。这种方法的问题是,一旦你这样做,触摸只会在你返回的视图上操作。我需要在 RMMapView 和 MKMapView 上进行触摸。
  2. 在我的超级视图中创建了一个手势识别器。然后,我尝试将这些内容传递给我的两个子视图。真的,真的,虽然这可能有效。但据我所知,有几个问题。首先,我知道两个地图视图顶部都有滚动视图,因此将触摸转发到 MKMapView 和 RMMapView 不起作用。我想我必须将触摸转发到每个地图滚动视图。

所以我不认为 1 会工作,我不能让 2 工作。任何人都曾试图做这样的事情。2个不同的视图可以作用于相同的触摸事件还是获得事件的第一个视图获胜?

我的设计也可能是错误的,所以如果有人有其他建议,请把它扔掉。确实意识到我想远离修改 RMMapView,并且不能真正修改 MKMapView。

我能找到的最相关的帖子是:如何拦截 MKMapView 或 UIWebView 对象上的触摸事件?. 但我不想拦截 MKMapView 上的事件,我想在 SuperView 上拦截它们,这样我就可以传递给它的两个 sup 视图。

谢谢

4

2 回答 2

0

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

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

只需在您的实现中调用 [super touchesBegan..] 即可。

UIResponder 类参考文档中对此进行了说明:

讨论 这个方法的默认实现什么都不做。然而,UIResponder 的直接 UIKit 子类,尤其是 UIView,将消息转发到响应者链。要将消息转发给下一个响应者,请将消息发送给 super(超类实现);不要将消息直接发送给下一个响应者。例如,

[超级 touchesBegan:touches withEvent:event];

那是你需要的吗?

于 2014-02-22T21:13:53.320 回答
0

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

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

我会尝试的另一件事是对dispatch_async()这些调用使用 GCD,以免占用委托回调。

这种方法可能是完全不明智的,但我想我会把它扔在那里。

我认为您不会对共享触摸事件有太多运气。

于 2014-02-24T20:25:27.343 回答