Ios 如何使用MKOverlayPathView创建路径?
我一直在看苹果的iOS类参考文档,不幸的是我一点也不知道。我已经下载了他们的示例代码Ios 如何使用MKOverlayPathView创建路径?,ios,mapkit,mkmapview,cgpath,Ios,Mapkit,Mkmapview,Cgpath,我一直在看苹果的iOS类参考文档,不幸的是我一点也不知道。我已经下载了他们的示例代码KMLViewer,但是他们把它复杂化了。。。我真正想知道的是如何生成路径并将其添加到MKMapView。本文档讨论了如何使用CGPathRef,但并未真正解释如何使用。以下是如何生成路径并将其作为覆盖添加到MKMapView。我将使用一个MKPolylineView,它是MKOverlayPathView的一个子类,可以避免您引用任何CGPath,因为您创建了一条MKPolylineView(包含路径的数据),
KMLViewer
,但是他们把它复杂化了。。。我真正想知道的是如何生成路径并将其添加到MKMapView
。本文档讨论了如何使用CGPathRef
,但并未真正解释如何使用。以下是如何生成路径并将其作为覆盖添加到MKMapView
。我将使用一个MKPolylineView
,它是MKOverlayPathView
的一个子类,可以避免您引用任何CGPath
,因为您创建了一条MKPolylineView
(包含路径的数据),并使用它来创建MKPolylineView
(地图上数据的视觉表示)
必须使用C点数组(MKMapPoint
)或C坐标数组(CLLocationCoordinate2D
)创建MKPolyline
)。很遗憾,MapKit没有使用更高级的数据结构,如NSArray
,但就这样吧!我假设您有一个NSArray
或NSMutableArray
的CLLocation
对象来演示如何转换为适合MKPolyline
的C数据数组。此数组称为d位置
以及填写方式将由您的应用程序决定-例如,通过用户处理触摸位置填写,或填写从web服务下载的数据等
在负责MKMapView
的视图控制器中:
int numPoints = [locations count];
if (numPoints > 1)
{
CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D));
for (int i = 0; i < numPoints; i++)
{
CLLocation* current = [locations objectAtIndex:i];
coords[i] = current.coordinate;
}
self.polyline = [MKPolyline polylineWithCoordinates:coords count:numPoints];
free(coords);
[mapView addOverlay:self.polyline];
[mapView setNeedsDisplay];
}
此视图控制器还应实现MKMapViewDelegate
方法:
- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease];
lineView.fillColor = [UIColor whiteColor];
lineView.strokeColor = [UIColor whiteColor];
lineView.lineWidth = 4;
return lineView;
}
然后重复上述过程以创建新的多段线并将其添加到地图中
虽然乍一看MapKit可能看起来有点可怕和复杂,但如本例所示,做一些事情是很容易的。唯一可怕的一点——至少对于非C程序员来说——是使用malloc创建缓冲区,使用数组语法将CLLOCATIONCOLATIONS复制到其中,然后释放内存缓冲区。MKOverlayPathView有一个
-path
属性,您可以直接用CGPathRef设置。您对如何创建CGPathRef感到困惑吗?非常好的解释…您节省了我的时间…非常感谢。不起作用。设置多段线(视图)视觉属性的委托方法在哪里,从调用?我在其中放置了一个日志,并观察到它从未被调用。我是否做错了什么?您是否将视图控制器设置为MKMapViewDelegate
?这将导致调用mapView:viewForOverlay
。mapView:viewForOverlay可能不会被调用的一个原因是您没有设置mapView.del视图控制器中的ete=self。OP忽略了该步骤。哎呀,我的注释有一个输入错误。它应该说mapView.delegate=self。self将是视图控制器。MKPolyline没有委托属性,所以我不确定您为什么要设置它。需要为mapView:viewForOve设置委托的是MKMapView对象雷:待命。
- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease];
lineView.fillColor = [UIColor whiteColor];
lineView.strokeColor = [UIColor whiteColor];
lineView.lineWidth = 4;
return lineView;
}
[mapView removeOverlay:self.polyline];
self.polyline = nil;