2014-10-22 54 views
1

我试图跟踪用户的路线和绘制线的路线,但addOverlay只给我正确的点,但每个点之间没有连接。MKPolyline只绘制点而不是线

-(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

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

对象内部的coordinate在每个时刻都可能不同,但对委托方法的每次调用始终指向相同的容器对象。

具体来说,它总是指向地图视图的userLocation属性指向(mapView.userLocation)的相同对象。你可以看到这个,如果你NSLoguserLocationmapView.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]; 
+0

谢谢!这完美地解决了我的问题。 – 2014-10-22 23:13:42