我正在尝试跟踪用户的路线和路线图,但是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;
}
最佳答案
map 视图传递给userLocation
委托方法的didUpdateUserLocation
对象每次都是相同的对象。
对象内部的coordinate
随时可能有所不同,但是对委托方法的每次调用始终指向相同的容器对象。
具体来说,它始终指向 map 视图的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];
关于ios - MKPolyline仅绘制点而不是线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26506407/