一切都在主题中说过,所以这里是代码
- (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
实现MKOverlay
。 MKOverlayPathRenderer
是MKOverlayRenderer
和NSObject
的子类。它仅符合NSObject
协议。MKOverlayPathRenderer
绘制符合MKOverlay
的某些模型叠加层对象的视觉表示。
因此,需要两个单独的对象(类似于注释的工作方式):
MKOverlay
的对象。 MKOverlayRenderer
(或iOS 7之前的MKOverlayView
)的某些子类。 该过程是首先使用
MKMapView
或addOverlay:
方法为addOverlays:
提供模型对象。然后,在
rendererForOverlay
委托方法中,当 map 视图实际要显示某些叠加层时,将调用该方法,为该叠加层创建并返回渲染器(视图)。创建渲染器的代码通常在
rendererForOverlay
委托方法中,并且应使用initWithOverlay
方法(而不是init
),并且应传递要为其创建渲染器的overlay
模型对象。对于
addOverlay
,您将创建一些叠加模型对象-某些标准类,例如MKPolyline
,MKPolygon
,MKCircle
或自定义类。但是您确定需要
MKOverlayPathRenderer
吗? 如果只想绘制简单的线,圆或多边形,请使用已经提供的渲染器,这些渲染器会自动为您绘制这些对象。比创建自己的
MKOverlayPathRenderer
子类要容易得多。MKPolylineRenderer
,MKPolygonRenderer
和MKCircleRenderer
是MKOverlayPathRenderer
的内置子类,可在不编写任何绘图代码的情况下绘制它们的相关模型覆盖图。关于ios - 将MKOverlayPathRenderer作为叠加层添加到MKMapView会发生异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24755462/