7

私はそれについて多くの投稿を読みましたが、それでも問題があります。これは、2点間にポリラインを描画するための私のコードです。

-(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、追加するときにそれぞれにを設定し、削除する前に確認することができます。


直接チェックして削除する2番目のコードは、現在マップ上にあるオーバーレイへの有効な参照が含まれているself.routeLine限り、機能するはずです。self.routeLinenil


マップ上にオーバーレイが1つしかない場合(1つのポリライン)、呼び出し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]])

3番目のスニペットで問題ありません

于 2012-10-07T13:56:42.460 に答える