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 userLocation您就会看到这一点。mapView.userLocation


因此,当代码执行此操作时:

[self.trackPointArray addObject:userLocation];

它只是多次向数组添加相同的对象引用。

后来,当代码循环遍历trackPointArray数组时,每次调用[location coordinate]都会返回相同的坐标,因为location总是指向同一个对象(mapView.userLocation)并且坐标在循环期间不会改变。

因此,每次调用委托方法时,都会创建一条带有 N 个坐标(都相同)的折线,最终绘制一个“点”。

您看到多个点的原因是代码没有删除以前的覆盖。


CLLocation要解决所有这些问题,一种简单的方法是在每次要添加更新的坐标时 创建一个新实例:

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 回答