2011-12-09 11 views
15

Sto utilizzando la chiamata personalizzata (titolo e sottotitoli) per l'icona Posizione corrente. Ho provato a seguire per disabilitare l'annotazione predefinita ma non funziona.canShowCallOut = NO per l'annotazione della posizione corrente, 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; 
    } 

} 

solo modo in cui funziona è

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

Ma è in ritardo rispetto a volte. C'è un altro modo per disabilitare la vista di callout predefinita per l'annotazione della posizione corrente? Qualsiasi aiuto sarà apprezzato.

+0

vuoi dire il punto blu per l'annotazione di default per la posizione attuale? – Ravin

+0

@Ravin, sì. Per annotazione posizione corrente, intendo punto pulsante blu. – chatur

risposta

28

per ottenere questo fatto una necessità di ottenere di riferimento della posizione corrente MKAnnotationView. Si può ottenere questo riferimento ovunque ma è meglio ottenerlo non appena viene determinata la posizione dell'utente.

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

} 

O uso seguente metodo

- (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; 

      } 
    } 

e se vogliono cambiare in proprietà canShowCallout in fase di esecuzione, allora si può usare seguente

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

Ho trovato che la soluzione intermedia non è corretta, perché iterate sulle viste, quindi la classe sarà 'MKUserLocationView' invece di' MKUserLocation', che sembra essere una classe privata. Ti consiglio di confrontare l'inverso: devi disattivare 'canShowCallout' quando la classe dell'annotazione NON è la classe della tua annotazione (' MKAnnotation' per esempio). – gklka

+10

Questo ha smesso di funzionare in iOS7; la soluzione alternativa (che supporta anche le versioni precedenti) consiste nell'impostare 'userLocation.title = @" ";' nel metodo 'mapView: didUpdateUserLocation' L'impostazione del titolo su una stringa vuota impedisce il richiamo del callout. –

+1

Nessuno di questi metodi ha funzionato bene su iOS 7. Il callout è stato disattivato, ma il punto blu era ancora selezionabile: è possibile stabilire se si sovrappone a un'altra annotazione della mappa. –

0

EDIT

Ci scusiamo per ottenere è sbagliato.

Ho sbattuto la testa su questo.

Questo è l'unico modo in cui sono riuscito a farlo. il problema con questo metodo è che devi cambiare la vista UserLocation. Quindi potrebbe non essere così facile da usare.

Qualsiasi modo:

- (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; 
    }; 
    ........} 

devono correre alla scuola materna a prendere mio figlio :)

Buona fortuna

+0

L'ho provato. Ma viene ancora visualizzata la chiamata predefinita. – chatur

+0

puoi mostrare dove hai inserito questo codice? – shannoga

+0

Modificato la mia risposta – shannoga

6

un aggiornamento a questo, utilizzando veloce (sulla base di la risposta di chatur):

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

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

} 

Nota: se usi questo, non ho bisogno di niente altro per farlo funzionare

1

Questo ha funzionato per me su Swift 3.0/iOS 10.

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

Invece di scorrere tutti i punti di vista, ho basta fare affidamento sul comando filter, seguito dalla chiamata facoltativa al primo poiché ci dovrebbe essere solo una posizione, quindi impostare il valore su falso.

1

Swift:

Questo ha funzionato per me: Basta aggiungere questo metodo delegato.

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 
} 
Problemi correlati