2011-12-09 25 views
15

Estoy usando una llamada personalizada (título y subtítulo) para el ícono de ubicación actual. Intenté seguir para deshabilitar la anotación predeterminada, pero no funciona.configuración canShowCallOut = NO para la anotación de ubicación actual, iPhone

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    NSLog(@"viewForAnnotation"); 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     MKAnnotationView *userLocationView = [mapView viewForAnnotation:annotation]; 
     userLocationView.canShowCallout = NO; 
     NSLog(@"[annotation isKindOfClass:[MKUserLocation class]"); 
     return nil; 
    } 

} 

Sólo forma en que funciona es

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)ann 
{ 
    if([ann.annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     [mymap deselectAnnotation:ann.annotation animated:NO]; 
    } 
} 

Pero desfases veces. ¿Hay alguna otra manera de desactivar la vista de llamada predeterminada para la anotación de ubicación actual? Cualquier ayuda será apreciada.

+0

Qué quiere decir el punto azul por defecto para la anotación de la ubicación actual? – Ravin

+0

@Ravin, sí. Por Anotación de ubicación actual me refiero al punto pulsante azul. – chatur

Respuesta

28

para hacer esto una necesidad para obtener la referencia de la ubicación actual MKAnnotationView. Uno puede obtener esta referencia en cualquier lugar, pero es mejor obtenerla tan pronto como se determine la ubicación del usuario.

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation]; 
annotationView.canShowCallout = NO; 

} 

O uso siguiente método

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
MKAnnotationView *aV; 
    for (aV in views) { 
      if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { 
       MKAnnotationView* annotationView = aV; 
       annotationView.canShowCallout = NO; 

      } 
    } 

y si quieren cambiar en canShowCallout propiedad en tiempo de ejecución a continuación, se puede utilizar después de

for (AnnotationClass* annotation in mapView.annotations) 
    { 
     if([annotation isKindOfClass:[MKUserLocation class]]) 
     { 
      MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation]; 
      annotationView.canShowCallout = NO; 
     } 
    } 
+0

Descubrí que la solución del medio no es correcta, porque itera en las vistas, por lo tanto, la clase será 'MKUserLocationView' en lugar de' MKUserLocation', que parece ser una clase privada. Te recomiendo que compares lo inverso: deberás desactivar 'canShowCallout' cuando la clase de la anotación NO sea tu propia clase de anotación (' MKAnnotation' por ejemplo). – gklka

+10

Esto ha dejado de funcionar en iOS7; la solución (que también admite versiones anteriores) es establecer 'userLocation.title = @" ";' en el método 'mapView: didUpdateUserLocation' Establecer el título en una cadena vacía impide que aparezca la llamada. –

+1

Ninguno de estos métodos funcionó bien para mí en iOS 7. La llamada estaba deshabilitada, pero el punto azul aún se podía seleccionar: puede ver si se superpone con otra anotación de mapa. –

0

EDITAR

Lo siento por conseguir que equivocado.

Me golpeé la cabeza con esto.

Esta es la única forma en que he tenido éxito al hacerlo. el problema con este método es que debe cambiar la vista de UserLocation. Por lo tanto, podría no ser tan fácil de usar.

De cualquier manera:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{ 
if ([annotation isKindOfClass:[MKUserLocation class]]){ 

     MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation                   reuseIdentifier:nil]; 
     annotationView.image = [UIImage imageNamed:@"your-icon.png"]; 
     annotationView.enabled=NO; 
     return annotationView; 
    }; 
    ........} 

tienen que correr a la guardería a llevar a mi hijo :)

Buena suerte

+0

Lo intenté. Pero aún aparece la llamada predeterminada. – chatur

+0

¿Puedes mostrar dónde colocaste este código? – shannoga

+0

Editado mi respuesta – shannoga

6

una actualización de este, usando rápida (sobre la base de respuesta de chatur):

func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) { 

    for view in views { 
     if view.annotation.isKindOfClass(MKUserLocation) { 
      view.canShowCallout = false 
     } 
    } 

} 

Nota: el uso de este, i no requiere nada más que hacer que funcione

1

Esto funcionó para mí en Swift 3.0/IOS 10.

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) { 
    (views.filter { $0.isKind(of: MKUserLocation.self) }).first?.canShowCallout = false 
} 

En lugar de recorrer todos los puntos de vista, yo solo confíe en el comando filter, seguido de la llamada opcional primero ya que solo debe haber una ubicación y luego establezca el valor en falso.

1

Swift:

Esto funcionó para mí: Sólo tiene que añadir este método delegado.

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) { 
    for var view in views { 
     view.canShowCallout = false 
    } 
} 
1
// Objective-C 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
     MKAnnotationView *userLocationView = [mapView viewForAnnotation:userLocation]; 
     userLocationView.canShowCallout = NO; 
} 

// Swift 3 

func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { 
     let userAnnotationView = mapView.view(for: userLocation) 
     userAnnotationView?.canShowCallout = false 
} 
Cuestiones relacionadas