1

一切都在主题中,所以这里是代码

- (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 的参考中所说 - 它确实如此。所以我有点卡在这个问题上。

4

1 回答 1

3

MKOverlayPathRenderer不执行MKOverlay协议。

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

你给它的对象没有这样做,所以你得到了那个异常(实现的对象MKOverlay必须有一个boundingMapRect属性)。

在您的问题中,声明:

正如在参考 MKOverlayPathRenderer 中所说 - 它确实

没有意义。

文档没有说MKOverlayPathRenderer实现MKOverlay. MKOverlayPathRenderer是 和 的子MKOverlayRendererNSObject。它仅符合NSObject协议。


AnMKOverlayPathRenderer绘制了一些符合. _MKOverlay

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

  1. 覆盖的模型MKOverlay- 实现的东西。
  2. 叠加层的视图——某些子类MKOverlayRenderer(或MKOverlayView在 iOS 7 之前)。

该过程是首先MKMapView使用or方法给出模型对象。addOverlay:addOverlays:

然后在rendererForOverlay地图视图实际想要显示某些叠加层时调用的委托方法中,您为相关叠加层创建并返回渲染器视图)。


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

对于addOverlay,您将创建一些覆盖模型对象 - 一些标准类(如MKPolylineMKPolygonMKCircle)或自定义类。


但是你确定你需要一个MKOverlayPathRenderer吗?

如果您只想绘制简单的线、圆或多边形,请使用已经提供的渲染器自动为您绘制这些对象。与创建自己的MKOverlayPathRenderer.

MKPolylineRenderer, MKPolygonRenderer, 和是绘制其相关模型叠加层MKCircleRenderer的内置子类,无需您编写任何绘图代码。MKOverlayPathRenderer

于 2014-07-15T12:06:39.143 回答