将MKOverlayPathRenderer添加为MKMapView的叠加层会获得异常

时间:2014-07-15 10:10:19

标签: ios mkmapview mapkit mkoverlay mkoverlaypathrenderer

主题中所说的一切,所以这里是代码

- (void)viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     _pathRenderer = [[MKOverlayPathRenderer alloc] init];
     _pathRenderer.lineWidth = 8.0f;
     _pathRenderer.strokeColor = [UIColor redColor];
     _pathRenderer.path = CGPathCreateMutable();
     [_mapView addOverlay:_pathRenderer];
}

在最后一行,它除外:

  Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKOverlayPathRenderer boundingMapRect]: unrecognized selector 

这意味着我正在使用没有实现MKOverlay的错误类,我得到了它,但正如MKOverlayPathRenderer的参考中所述 - 它确实如此。所以我对这个问题有点困惑。

1 个答案:

答案 0 :(得分:3)

MKOverlayPathRenderer未实施MKOverlay协议。

addOverlay需要一个符合MKOverlay协议的对象。

您提供的对象不会这样做,因此您获得该异常(实现MKOverlay的对象必须具有boundingMapRect属性)。

在你的问题中,声明:

  

如MKOverlayPathRenderer的参考文献所述 - 它确实

没有意义。

文档未说明MKOverlayPathRenderer实施MKOverlayMKOverlayPathRendererMKOverlayRendererNSObject的子类。它仅符合NSObject协议。


MKOverlayPathRenderer绘制符合MKOverlay的某些模型重叠对象的可视表示。

因此需要两个单独的对象(类似于注释的工作方式):

  1. 叠加层的模型 - 实现MKOverlay
  2. 的内容
  3. 叠加层的视图 - MKOverlayRenderer的某些子类(或iOS 7之前的MKOverlayView)。
  4. 该过程首先使用MKMapViewaddOverlay:方法提供addOverlays: 模型对象。

    然后在rendererForOverlay委托方法中,地图视图在实际显示某些叠加层时会调用该方法,您可以创建并返回渲染器 view )对于有问题的叠加层。


    您创建渲染器的代码通常位于rendererForOverlay委托方法中,应该使用initWithOverlay方法(而不是init)并且应该传递overlay模型对象您要为其创建渲染器。

    对于addOverlay,您可以创建一些叠加模型对象 - 标准类,如MKPolylineMKPolygonMKCircle或自定义类。


    但您确定需要MKOverlayPathRenderer吗?

    如果您只想绘制一条简单的直线,圆或多边形,请使用已经提供的渲染器自动为您绘制这些对象。您将比创建自己的MKOverlayPathRenderer子类更容易。

    MKPolylineRendererMKPolygonRendererMKCircleRendererMKOverlayPathRenderer的内置子类,无需编写任何绘图代码即可绘制相关的模型叠加层。