如何计算用户移动时从用户位置到注释的距离
我有一个用户位置(蓝点)和mapView
注释。 当select注释时,我将文本设置为distLabel
– “到点%4.0f m的距离”。 用户移动时如何更新该文本标签?
didSelectAnnotationView:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude: [(MyAnnotation*)[view annotation] coordinate].latitude longitude: [(MyAnnotation*)[view annotation] coordinate].longitude]; CLLocation *userLocation = [[CLLocation alloc] initWithLatitude: self.mapView.userLocation.coordinate.latitude longitude: self.mapView.userLocation.coordinate.longitude]; CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]; [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.", distance]]; }
我知道有一个函数didUpdateToLocation
,但我怎样才能用它didSelectAnnotationView
?
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { //Did update to location }
地图视图具有一个selectedAnnotations
属性,您可以在didUpdateToLocation
方法中使用该didUpdateToLocation
来确定哪个注释可以获取距离。
(顺便说一句,如果你正在使用地图视图的userLocation
,你可能想使用地图视图的didUpdateUserLocation
委托方法,而不是使用CLLocationManager
委托方法的didUpdateToLocation
。)
在委托方法中,您可以检查是否有任何当前选定的注释,如果是,则显示与该注释的距离(否则称为“不select注释”)。
您可能希望编写一个可以从didSelectAnnotationView
和didUpdateUserLocation
调用的常用方法,以减less代码重复。
例如:
-(void)updateDistanceToAnnotation:(id<MKAnnotation>)annotation { if (annotation == nil) { distLabel.text = @"No annotation selected"; return; } if (mapView.userLocation.location == nil) { distLabel.text = @"User location is unknown"; return; } CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude]; CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:mapView.userLocation.coordinate.latitude longitude:mapView.userLocation.coordinate.longitude]; CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]; [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.", distance]]; } -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { if (mapView.selectedAnnotations.count == 0) //no annotation is currently selected [self updateDistanceToAnnotation:nil]; else //first object in array is currently selected annotation [self updateDistanceToAnnotation:[mapView.selectedAnnotations objectAtIndex:0]]; } - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { [self updateDistanceToAnnotation:view.annotation]; }