2011-12-09 11 views
15

Używam niestandardowego wywołania (tytuł i podtytuł) dla ikony Bieżąca lokalizacja. Próbowałem po wyłączeniu domyślnej adnotacji, ale nie działa.ustawienie canShowCallOut = NIE dla adnotacji o obecnej lokalizacji, 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; 
    } 

} 

tylko sposób działania jest

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

Ale czasami nie nadąża. Czy istnieje inny sposób wyłączenia domyślnego widoku objaśnień dla bieżącej adnotacji lokalizacji? Każda pomoc zostanie doceniona.

+0

Czy oznacza niebieski punkt domyślnie adnotacji o aktualnej lokalizacji? – Ravin

+0

@Ravin, Tak. Przez adnotację Obecna lokalizacja mam na myśli niebieską pulsującą kropkę. – chatur

Odpowiedz

28

aby to zrobić jedną potrzebę, aby uzyskać odniesienie do bieżącej lokalizacji MKAnnotationView. Można uzyskać to odwołanie w dowolnym miejscu, ale lepiej jest je zdobyć, gdy tylko zostanie ustalona lokalizacja użytkownika.

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

} 

lub użyj następującej metody

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

      } 
    } 

i jeśli chcesz zmienić w nieruchomości canShowCallout w czasie wykonywania następnie można użyć następujących

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

Stwierdziłem, że środkowe rozwiązanie nie jest poprawne, ponieważ iterujesz na widokach, dlatego klasa będzie miała nazwę 'MKUserLocationView' zamiast' MKUserLocation', która wydaje się być prywatną klasą. Polecam ci porównanie odwrotności: wyłączysz 'canShowCallout', gdy klasa adnotacji NIE jest twoją własną klasą adnotacji (na przykład" MKAnnotacja "). – gklka

+10

To przestało działać w iOS7; obejście (które obsługuje również wcześniejsze wersje) polega na ustawieniu 'userLocation.title = @" ";' w metodzie 'mapView: didUpdateUserLocation' Ustawienie tytułu na pusty ciąg zapobiega wyświetlaniu objaśnień. –

+1

Żadna z tych metod nie działa dobrze na iOS 7. Objaśnienie było wyłączone, ale niebieska kropka była nadal dostępna do wyboru - można stwierdzić, czy nakłada się ona z inną adnotacją mapy. –

0

EDIT

Niestety uzyskania mylisz.

Uderzyłem w to głową.

To jedyny sposób, w jaki udało mi się to zrobić. Problem z tą metodą polega na tym, że musisz zmienić widok UserLocation. Więc może nie być tak przyjazny dla użytkownika.

Każdy sposób:

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

musiał biegać do przedszkola wziąć moje dziecko :)

Powodzenia

+0

Próbowałem tego. Ale nadal wyświetla się domyślne wywołanie. – chatur

+0

czy możesz pokazać, gdzie umieściłeś ten kod? – shannoga

+0

Edytowałem moją odpowiedź – shannoga

6

aktualizację do tego, używając Swift (na podstawie Odpowiedź chatur):

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

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

} 

Uwaga: za pomocą tego, i nie wymaga niczego innego, aby to działało

1

ten pracował dla mnie na Swift 3.0/iOS 10.

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

zamiast pętli przez wszystkie widoki, ja wystarczy użyć polecenia filter, a następnie opcjonalnie wywołać pierwsze, ponieważ powinna istnieć tylko jedna lokalizacja, a następnie ustawić wartość na false.

1

Swift:

Ten pracował dla mnie: Wystarczy dodać tę metodę delegata.

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 
} 
Powiązane problemy