Ios 如何使用MKOverlayPathView创建路径?

Ios 如何使用MKOverlayPathView创建路径?,ios,mapkit,mkmapview,cgpath,Ios,Mapkit,Mkmapview,Cgpath,我一直在看苹果的iOS类参考文档,不幸的是我一点也不知道。我已经下载了他们的示例代码KMLViewer,但是他们把它复杂化了。。。我真正想知道的是如何生成路径并将其添加到MKMapView。本文档讨论了如何使用CGPathRef,但并未真正解释如何使用。以下是如何生成路径并将其作为覆盖添加到MKMapView。我将使用一个MKPolylineView,它是MKOverlayPathView的一个子类,可以避免您引用任何CGPath,因为您创建了一条MKPolylineView(包含路径的数据),

我一直在看苹果的iOS类参考文档,不幸的是我一点也不知道。我已经下载了他们的示例代码
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;