Вопрос по ios, xcode – Как рассчитать расстояние от местоположения пользователя до аннотации при перемещении пользователя

7

У меня есть местоположение пользователя (синяя точка) и аннотации наmapView, Когда аннотация выбрана, я устанавливаю текст вdistLabel - "Расстояние до точки% 4,0 м". Как я могу обновить эту текстовую метку, когда пользователь перемещается?

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
}

Ваш Ответ

1   ответ
15

selectedAnnotations свойство, которое вы можете использовать вdidUpdateToLocation метод, чтобы сказать, от какой аннотации получить расстояние.

(Кстати, если вы используете вид картыuserLocation, вы можете захотеть использовать вид картыdidUpdateUserLocation метод делегата вместоdidUpdateToLocation который являетсяCLLocationManager метод делегата.)

В методе делегата вы можете проверить, есть ли какая-либо аннотация, выбранная в данный момент, и, если это так, показать расстояние до этой аннотации (в противном случае произнесите «аннотация не выбрана»).

Возможно, вы захотите написать общий метод, который может быть вызван как изdidSelectAnnotationView а такжеdidUpdateUserLocation уменьшить дублирование кода.

Например:

-(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];
}
Отличный ответ как всегда от вас! Спасибо! Pavel Kaljunen

Похожие вопросы