主题中所说的一切,所以这里是代码
- (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的参考中所述 - 它确实如此。所以我对这个问题有点困惑。
答案 0 :(得分:3)
MKOverlayPathRenderer
未实施MKOverlay
协议。
addOverlay
需要一个符合MKOverlay
协议的对象。
您提供的对象不会这样做,因此您获得该异常(实现MKOverlay
的对象必须具有boundingMapRect
属性)。
在你的问题中,声明:
如MKOverlayPathRenderer的参考文献所述 - 它确实
没有意义。
文档未说明MKOverlayPathRenderer
实施MKOverlay
。 MKOverlayPathRenderer
是MKOverlayRenderer
和NSObject
的子类。它仅符合NSObject
协议。
MKOverlayPathRenderer
绘制符合MKOverlay
的某些模型重叠对象的可视表示。
因此需要两个单独的对象(类似于注释的工作方式):
MKOverlay
。MKOverlayRenderer
的某些子类(或iOS 7之前的MKOverlayView
)。该过程首先使用MKMapView
或addOverlay:
方法提供addOverlays:
模型对象。
然后在rendererForOverlay
委托方法中,地图视图在实际显示某些叠加层时会调用该方法,您可以创建并返回渲染器( view )对于有问题的叠加层。
您创建渲染器的代码通常位于rendererForOverlay
委托方法中,应该使用initWithOverlay
方法(而不是init
)并且应该传递overlay
模型对象您要为其创建渲染器。
对于addOverlay
,您可以创建一些叠加模型对象 - 标准类,如MKPolyline
,MKPolygon
,MKCircle
或自定义类。
但您确定需要MKOverlayPathRenderer
吗?
如果您只想绘制一条简单的直线,圆或多边形,请使用已经提供的渲染器自动为您绘制这些对象。您将比创建自己的MKOverlayPathRenderer
子类更容易。
MKPolylineRenderer
,MKPolygonRenderer
和MKCircleRenderer
是MKOverlayPathRenderer
的内置子类,无需编写任何绘图代码即可绘制相关的模型叠加层。