添加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
实现MKOverlay
。 MKOverlayPathRenderer
是MKOverlayRenderer
和NSObject
的子类。 它只符合NSObject
协议。
MKOverlayPathRenderer
绘制符合MKOverlay
的某个模型叠加对象的可视化表示。
所以需要两个独立的对象(类似于注释的工作方式):
- 覆盖模型 – 实现
MKOverlay
东西。 - 覆盖的视图 –
MKOverlayRenderer
(或iOS 7之前的MKOverlayRenderer
一些子类。
该过程是首先使用addOverlay:
或addOverlays:
方法为MKMapView
模型对象。
然后,在rendererForOverlay
委托方法中,地图视图在实际上要显示某个叠加层时将调用该方法,您将为叠加层创build并返回一个渲染器 ( 视图 )。
您创build渲染器的代码通常位于rendererForOverlay
委托方法中,并且应使用initWithOverlay
方法(而不是init
),并应传递要为其创build渲染器的overlay
模型对象。
对于addOverlay
,您可以创build一些覆盖模型对象 – 或者像MKPolyline
, MKPolygon
, MKCircle
或自定义类的标准类。
但是你确定你需要一个MKOverlayPathRenderer
吗?
如果您只是想绘制一个简单的线条,圆形或多边形,请使用已提供的渲染器为您自动绘制这些对象。 您将比创build自己的MKOverlayPathRenderer
子类更容易。
MKPolylineRenderer
, MKPolygonRenderer
和MKCircleRenderer
是MKCircleRenderer
的内置子类, MKOverlayPathRenderer
可以绘制相关的模型叠加层,而无需编写任何绘图代码。