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

- (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的参考中所说的-它确实可以。因此,我对此问题有些困惑。

最佳答案

MKOverlayPathRenderer不实现MKOverlay协议。
addOverlay需要一个符合MKOverlay协议的对象。

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

在您的问题中,声明:

如在MKOverlayPathRenderer的参考中所述-它确实

没有道理。

该文档没有说MKOverlayPathRenderer实现MKOverlayMKOverlayPathRendererMKOverlayRendererNSObject的子类。它仅符合NSObject协议。
MKOverlayPathRenderer绘制符合MKOverlay的某些模型叠加层对象的视觉表示。

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

  • 叠加层的模型-实现MKOverlay的对象。
  • 叠加层的视图-MKOverlayRenderer(或iOS 7之前的MKOverlayView)的某些子类。

  • 该过程是首先使用MKMapViewaddOverlay:方法为addOverlays:提供模型对象。

    然后,在rendererForOverlay委托方法中,当 map 视图实际要显示某些叠加层时,将调用该方法,为该叠加层创建并返回渲染器(视图)。

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

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

    但是您确定需要MKOverlayPathRenderer吗?

    如果只想绘制简单的线,圆或多边形,请使用已经提供的渲染器,这些渲染器会自动为您绘制这些对象。比创建自己的MKOverlayPathRenderer子类要容易得多。
    MKPolylineRendererMKPolygonRendererMKCircleRendererMKOverlayPathRenderer的内置子类,可在不编写任何绘图代码的情况下绘制它们的相关模型覆盖图。

    关于ios - 将MKOverlayPathRenderer作为叠加层添加到MKMapView会发生异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24755462/

    10-09 15:54