有没有人有任何关于如何使用MKOverlayPathView创buildpath的例子?
我一直在看苹果的iOS类参考文档,不幸的是没有更聪明的。 我已经下载了他们的示例代码KMLViewer
但他们已经过度复杂…我真的想知道的是如何生成一个path,并将其添加到MKMapView
。 文档谈到使用CGPathRef
,但没有真正解释如何。
任何人都可以帮助或指出我在正确的方向吗? 谢谢!
这里是如何生成一个path,并将其作为覆盖添加到MKMapView
。 我将使用一个MKPolylineView
,它是MKPolylineView
一个子类,屏蔽了您不必引用任何CGPath
因为您创build了一个MKPolyline
(包含path的数据),并使用它来创buildMKPolylineView
(可视化表示的地图上的数据)。
MKPolyline
必须用C数组的点( MKMapPoint
)或C数组的坐标( CLLocationCoordinate2D
)来创build。 MapKit不使用更高级的数据结构,比如NSArray
,这真是一个耻辱,但是这么做! 我将假设你有一个NSArray
或NSMutableArray
的CLLocation
对象来演示如何转换成适合MKPolyline
的C数组数据。 这个数组被称为locations
,如何填充它将由您的应用程序决定 – 例如由用户处理触摸位置填充,或填充从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]; }
请注意,self.polyline在.h中声明为:
@property (nonatomic, retain) MKPolyline* polyline;
这个视图控制器也应该实现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; }
您可以使用fillColor,strokeColor和lineWidth属性来确保它们适合您的应用程序。 我刚刚在这里用一个简单的,适度宽的纯白线。
如果你想从地图上删除path,例如用一些新的坐标来更新它,那么你应该这样做:
[mapView removeOverlay:self.polyline]; self.polyline = nil;
然后重复上述过程来创build一个新的MKPolyline并将其添加到地图。
虽然乍一看MapKit看起来有点恐怖和复杂,但是可以很容易地做一些事情,如本例所示。 对于非C程序员来说,唯一可怕的地方就是使用malloc来创build缓冲区,使用数组语法将CLLocationCoordinates复制到缓冲区中,然后释放内存缓冲区。