1

ユーザーのルートを追跡し、ルートの線を描画しようとしていますが、addOverlay正しいポイントのみが得られますが、各ポイント間の接続はありません。

-(void)viewWillAppear:(BOOL)animated{
    self.trackPointArray = [[NSMutableArray alloc] init];
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(CLLocation *)userLocation
{
    [self.trackPointArray addObject:userLocation];

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1000, 1000);
    [self.myMapView setRegion:[self.myMapView regionThatFits:region] animated:YES];

    NSInteger stepsNumber = self.trackPointArray.count;

    CLLocationCoordinate2D coordinates[stepsNumber];
    for (NSInteger index = 0; index < stepsNumber; index++) {
        CLLocation *location = [self.trackPointArray objectAtIndex:index];
        coordinates[index] = [location coordinate];
    }
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:stepsNumber];
    [self.myMapView addOverlay:polyLine];
}


- (MKOverlayRenderer *)mapView:(MKMapView *)myMapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    polylineRenderer.lineWidth = 4.0f;
    polylineRenderer.strokeColor = [UIColor redColor];
    return polylineRenderer;
}
4

1 に答える 1

1

userLocationマップ ビューがdidUpdateUserLocationデリゲート メソッドに渡すオブジェクトは、毎回同じオブジェクトです。

オブジェクトのcoordinate内部はその時々で異なる場合がありますが、デリゲート メソッドへの各呼び出しは常に同じコンテナー オブジェクトを指します。

userLocation具体的には、マップ ビューのプロパティが指すオブジェクトと常に同じオブジェクトを指します ( mapView.userLocation)。これは、あなたNSLog userLocationmapView.userLocationと が毎回同じメモリ アドレスであることに気付くとわかります。


このため、コードがこれを行う場合:

[self.trackPointArray addObject:userLocation];

同じオブジェクト参照を配列に複数回追加するだけです。

後でコードがtrackPointArray配列をループするとき、各呼び出しは[location coordinate]毎回同じ座標を返します。これは、location常に同じオブジェクト ( ) を指しmapView.userLocation、ループ中に座標が変更されないためです。

そのため、デリゲート メソッドが呼び出されるたびに、N 座標 (すべて同じ) でポリラインが作成され、最終的に「ドット」が描画されます。

複数のドットが表示される理由は、コードが以前のオーバーレイを削除していないためです。


CLLocationこれらすべてを修正する簡単な方法の 1 つは、更新された座標を追加するたび に新しいインスタンスを作成することです。

CLLocation *tpLocation = [[CLLocation alloc] 
                           initWithLatitude:userLocation.coordinate.latitude 
                           longitude:userLocation.coordinate.longitude];
[self.trackPointArray addObject:tpLocation];

さらに、更新された行を追加する前に、以前のオーバーレイを削除する必要があります。これを行わないと、前の行に気付かないでしょうが、メモリとパフォーマンスを使い果たします。

[self.myMapView removeOverlays:self.myMapView.overlays];
[self.myMapView addOverlay:polyLine];
于 2014-10-22T12:50:20.320 に答える