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

Ios 是否可以将事件/手势传递给所有子视图?,ios,uiview,mkmapview,mapbox,route-me,Ios,Uiview,Mkmapview,Mapbox,Route Me,我正在尝试一个快速原型项目,看看我想用Mapbox iOS SDK(route me)和iOS MapKit做什么是可能的 我想看看我是否可以通过MapBox的离线功能(以及集群等附加功能)同时使用iOS地图类型,实现两个世界的最佳结合。经过一些研究(以及相关帮助),我发现Mapbox和iOS地图无法协同工作,您可以选择其中之一。我开始想,如果我在iOS映射的顶部放置一个RMMapView(mapbox映射)目录,会发生什么。然后,当我想查看iOS映射时,我可以将RMMapViews basem

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

我想看看我是否可以通过MapBox的离线功能(以及集群等附加功能)同时使用iOS地图类型,实现两个世界的最佳结合。经过一些研究(以及相关帮助),我发现Mapbox和iOS地图无法协同工作,您可以选择其中之一。我开始想,如果我在iOS映射的顶部放置一个RMMapView(mapbox映射)目录,会发生什么。然后,当我想查看iOS映射时,我可以将RMMapViews basemap设置为透明,这样它正下方的iOS映射就会显示出来。同样,如果需要,您可以使用iOS地图,但我也可以绘制地图盒标记,这样当您切换到iOS地图时,就不需要重新绘制标记

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

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

我所尝试的:

  • 覆盖命中测试。这种方法的问题是,一旦您这样做,触摸将只在您返回的视图上操作。我需要在RMMapView和MKMapView上进行触摸
  • 在我的超级视图中创建了一个手势识别器。然后,我尝试将这些内容传递给我的两个子视图。真的,真的,尽管这可能有用。但从我所知道的来看,有几个问题。首先,我知道两个地图视图的顶部都有滚动视图,因此将触摸转发到MKMapView和RMMapView无法工作。我想我必须将触摸转发到每个地图滚动视图
  • 因此,我认为1永远不会工作,我也无法让2工作。有人试过这样做。两个不同的视图可以对同一触控事件进行操作,还是第一个获取事件的视图获胜

    我的设计也可能是错误的,所以如果有人有其他建议,请扔掉它。但请务必意识到,我不想修改RMMapView,也不能真正修改MKMapView

    我能找到的最相关的帖子是:。但是我不想在MKMapView上截取事件,我想在SuperView上截取它们,这样我就可以传递到它的两个sup视图


    谢谢

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

    – touchesBegan:withEvent:
    – touchesMoved:withEvent:
    – touchesEnded:withEvent:
    – touchesCancelled:withEvent:
    
    只需在您的实现中调用[super TouchesStart..]

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

    讨论此方法的默认实现不起任何作用。 然而,UIResponder的直接UIKit子类,尤其是 UIView,将消息转发到响应程序链上。转发 将消息发送给下一个响应者,并将消息发送给超级( 超类实现);不要将消息直接发送到 下一个响应者。比如说,

    [超级触摸开始:触摸事件:事件]


    这就是您需要的吗?

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

    我还没有尝试过这一点,但您可以尝试在一侧或另一侧使用region/center/zoom change delegate方法来驱动对立面地图的更新。我可能会先用Mapbox
    ->
    MapKit试试,因为Mapbox有更细粒度的回调

    我要尝试的另一件事是使用GCD来
    分派\u async()
    这些调用,以避免阻塞委托回调

    这种方法可能是完全不明智的,但我想我会放弃它


    我不认为你会有太多的运气分享触摸事件

    我试图在SuperView中重写这些方法,然后将它们同时传递给MKMapView和RMMapView。但是,过度隐藏这些事件并将事件传递给MKMapView似乎会导致无限循环。您只能使用responder chain方法传递事件。它是UIView为您制作的。不要试图破解这个。听起来不错,但我的问题仍然存在。1.我试图重写响应器链方法,当我将事件传递给MKMapView时,它会导致无限循环。我只希望MKMapView和RMMapView都对事件做出响应。也就是说,如果我滚动地图,它们都会滚动。您的声明“我不确定是否完全理解您的需求”。在RMMapView的顶部,它吞噬了所有的触摸事件和手势。我需要它对这些触摸事件做出反应,但所有这些都会传递给它的兄弟视图。我没有试图传递给兄弟视图,而是试图截取超级视图中的事件,并让超级视图将这些事件传递给它的子视图。我需要SuperView的两个孩子来处理这些事件。你有没有找到解决方案?