2012-06-04 13 views
7

Tengo una ubicación de usuario (punto azul) y anotaciones en mapView. Cuando se selecciona la anotación, configuro texto en distLabel - "Distancia al punto% 4.0f m.". ¿Cómo puedo actualizar esa etiqueta de texto cuando el usuario se mueve?Cómo calcular la distancia desde la ubicación del usuario a la anotación cuando el usuario se mueve

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]]; 
} 

Sé que es una función didUpdateToLocation, pero ¿cómo puedo usarlo con didSelectAnnotationView?

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    //Did update to location 
} 

Respuesta

15

La vista del mapa tiene una propiedad selectedAnnotations que se puede utilizar en el método didUpdateToLocation decir cuál de anotación para obtener la distancia de.

(Por cierto, si está utilizando de userLocation la vista del mapa, es posible que desee utilizar el método didUpdateUserLocation delegado de la vista del mapa en lugar de didUpdateToLocation que es un método CLLocationManager delegado.)

En el método delegado, se puede verificar si hay alguna anotación actualmente seleccionada y, de ser así, mostrar la distancia a esa anotación (de lo contrario, decir "no se ha seleccionado ninguna anotación").

Es posible que desee escribir un método común que pueda llamarse desde didSelectAnnotationView y didUpdateUserLocation para reducir la duplicación de código.

Por ejemplo:

-(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]; 
} 
+0

Gran respuesta como siempre de usted! ¡Gracias! –

Cuestiones relacionadas