添加MKOverlayPathRenderer作为覆盖MKMapView获取exception

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

- (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]; } 

在最后一行,它会抛出exception:

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

这意味着我使用错误的类,没有实现MKOverlay,我明白了,但正如参考MKOverlayPathRenderer所说 – 它的确如此。 所以我有点卡住了这个问题。

MKOverlayPathRenderer不实现MKOverlay协议。

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

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

在你的问题中,声明:

正如参考MKOverlayPathRenderer所说的那样

没有意义。

该文档没有说MKOverlayPathRenderer实现MKOverlayMKOverlayPathRendererMKOverlayRendererNSObject的子类。 它只符合NSObject协议。

MKOverlayPathRenderer绘制符合MKOverlay的某个模型叠加对象的可视化表示。

所以需要两个独立的对象(类似于注释的工作方式):

  1. 覆盖模型 – 实现MKOverlay东西。
  2. 覆盖的视图MKOverlayRenderer (或iOS 7之前的MKOverlayRenderer一些子类。

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

然后,在rendererForOverlay委托方法中,地图视图在实际上要显示某个叠加层时将调用该方法,您将为叠加层创build并返回一个渲染器视图 )。

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

对于addOverlay ,您可以创build一些覆盖模型对象 – 或者像MKPolylineMKPolygonMKCircle或自定义类的标准类。

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

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

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