MKPolyline只绘制点而不是线

时间:2014-10-22 11:29:38

标签: ios ios7 mapkit mkpolyline

我正在尝试跟踪用户的路线并绘制路线的线条,但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;
}

1 个答案:

答案 0 :(得分:1)

地图视图传递给userLocation委托方法的didUpdateUserLocation对象每次都是相同的对象

对象内的coordinate每次都可能不同,但每次调用委托方法总是指向同一个容器对象。

具体来说,它始终指向地图视图的userLocation属性指向的同一对象(mapView.userLocation)。如果您NSLog userLocationmapView.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];