7

我已经阅读了很多关于它的帖子,但我仍然有问题。这是我在两点之间绘制折线的代码:

-(void) drawAline:(CLLocation*)newLocation
{
//drawing a line
CLLocationCoordinate2D coordinateArray[2];
coordinateArray[0] = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude);
coordinateArray[1] = CLLocationCoordinate2DMake(self.jerusalem.coordinate.latitude, self.jerusalem.coordinate.longitude);

self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:2];
[self.mapView setVisibleMapRect:[self.routeLine boundingMapRect]];
[self.mapView addOverlay:self.routeLine];

}

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
if(overlay == self.routeLine)
{
    if(nil == self.routeLineView)
    {
        self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
        self.routeLineView.fillColor = [UIColor blueColor];
        self.routeLineView.strokeColor = [UIColor blueColor];
        self.routeLineView.lineWidth = 5;
    }
    return self.routeLineView;
}

return nil;

}

多数民众赞成在工作正常。问题是删除线。下一个代码不起作用:

    for (id<MKOverlay> overlayToRemove in self.mapView.overlays)
{
    if ([overlayToRemove isKindOfClass:[MKPolylineView class]])
    {
        [mapView removeOverlay:overlayToRemove];
    }
}

下一个代码也不起作用:

     if (self.routeLine)
{
[self.mapView removeOverlay:self.routeLine];
    self.routeLineView = nil;
    self.routeLine = nil;
}

谢谢!

4

2 回答 2

17

在遍历地图视图overlays数组的代码中,这一行是问题所在:

if ([overlayToRemove isKindOfClass:[MKPolylineView class]])

地图视图的overlays数组包含类型id<MKOverlay>的对象(for 循环正确地声明overlayToRemove为这样)。

所以该overlays数组包含叠加层的模型对象,而不是视图

该类MKPolylineView是覆盖模型视图MKPolyline

所以if条件应该是:

if ([overlayToRemove isKindOfClass:[MKPolyline class]])

请注意,这样的循环将从地图中删除所有折线。如果你想删除特定的多段线,你可以title在添加时设置每一条,然后在删除之前检查它。


直接检查和删除的第二段代码self.routeLine应该可以正常工作,只要self.routeLine不是nil,并且包含对当前地图上叠加层的有效引用。


如果地图上只有一个叠加层(一条折线),您也可以调用removeOverlays从地图中删除所有叠加层(无论它们是什么):

[self.mapView removeOverlays:self.mapView.overlays];
于 2012-10-07T13:57:42.097 回答
2

您的叠加MKPolylineMKPolylineView是地图缩放或滚动时叠加层的显示方式,以便叠加层的数据显示在窗口中。地图视图的overlays数组包含将用于生成覆盖视图的数据。overlays数组中没有视图。因此,要使您的代码正常工作,请更改此行

if ([overlayToRemove isKindOfClass:[MKPolylineView class]])

if ([overlayToRemove isKindOfClass:[MKPolyline class]])

在你的第三个片段中,你会没事的

于 2012-10-07T13:56:42.460 回答