我正在尝试跟踪用户的路线并绘制路线的线条,但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;
}
答案 0 :(得分: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];