2010-08-03 12 views
22

Pracuję z MKMapView i MKAnnotationView.Wykryj Stuknij w CalloutBubble w MKAnnotationView

Mam adnotację na mapie. Gdy użytkownicy dotkną, pojawi się dymek CallOut. Po ponownym dotknięciu adnotacji (i widoczna jest bańka CallOut) muszę zmienić na inny widok.

Jak mogę wykryć drugie dotknięcie lub dotknięcie bańki?

+0

Znalazłeś rozwiązanie? –

+3

Najprostszy sposób polega na ustawieniu przycisku jako prawostronnegoAkcesoriaAwidectViewView i implementacji calloutAccessoryControlTapped. Czy to nie wystarcza, czy też musisz chwytać dotknięcia tytułu i podtytułu? – Anna

Odpowiedz

10

Czy możesz dodać narzędzie do rozpoznawania gestów podczas inicjowania MKAnnotationView?

Oto kod do wewnątrz dequeueReusableAnnotationViewWithIdentifier:

UITapGestureRecognizer *tapGesture = 
     [[UITapGestureRecognizer alloc] initWithTarget:self 
             action:@selector(calloutTapped:)]; 
[theAnnotationView addGestureRecognizer:tapGesture]; 
[tapGesture release]; 

Metoda dla rozpoznawania gestów:

-(void) calloutTapped:(id) sender { 
    // code to display whatever is required next. 

    // To get the annotation associated with the callout that caused this event: 
    // id<MKAnnotation> annotation = ((MKAnnotationView*)sender.view).annotation; 
} 
+4

Objaśnienie nie jest tożsame z widokiem adnotacji. Objaśnienie to dymek, który pojawia się po dotknięciu widoku objaśnień. – shim

+6

Dodałem gestRecognizer w mapView: didSelectAnnotationView: metoda i to rozwiązanie działały idealnie dla mnie. –

+0

@DanielT. Musisz MVP: P –

6

dotknij przycisk wywołania, gdy użytkownik kliknie na widoku opisu, dodać UITapGestureRecognizer w didSelectAnnotationView. W ten sposób możesz wdrożyć dotknięcie objaśnienia bez potrzeby wyświetlania widoków akcesoriów.

Następnie można odebrać obiekt adnotacji z powrotem od nadawcy w celu podjęcia dalszych działań.

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(calloutTapped:)]; 
    [view addGestureRecognizer:tapGesture]; 
} 

-(void)calloutTapped:(UITapGestureRecognizer *) sender 
{ 
    NSLog(@"Callout was tapped"); 

    MKAnnotationView *view = (MKAnnotationView*)sender.view; 
    id <MKAnnotation> annotation = [view annotation]; 
    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     [self performSegueWithIdentifier:@"annotationDetailSegue" sender:annotation]; 
    } 
} 
+2

Uważaj na to rozwiązanie. Problem polega na tym, że za każdym razem, gdy wybierasz adnotację, tworzysz gest dotykania, aby mieć problemy z tworzeniem wielu stuknięć, na przykład po wybraniu, odznaczeniu i ponownym wybraniu. Myślę, że lepiej jest dodać gestu dotykowego podczas inicjowania AnnotationView lub usuwania gestów przy cofnięciu wyboru – Beninho85

4

spróbuj ustawić własny obraz dla przycisku bez zmiany typu UIButtonTypeDetailDisclosure.

UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];   
[detailButton setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal]; 
+1

Niezły! Tak smutne, że takie rzeczy nie są nigdzie udokumentowane w APIs.-.- – Cabus

6

Oto szybka wersja odpowiedzi Dhanu, w tym pobieranie danych z wybranego aby przejść do następnego kontrolera widoku pozycji:

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    let gesture = UITapGestureRecognizer(target: self, action: #selector(MyMapViewController.calloutTapped(_:))) 
    view.addGestureRecognizer(gesture) 
} 

func calloutTapped(sender:UITapGestureRecognizer) { 
    guard let annotation = (sender.view as? MKAnnotationView)?.annotation as? MyAnnotation else { return } 

    selectedLocation = annotation.myData 
    performSegueWithIdentifier("mySegueIdentifier", sender: self) 
} 
0

Swift 3, używając On. Musisz obsłużyć:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    switch annotation { 
    case let annotation as Annotation: 
    let view: AnnotationView = mapView.dequeue(annotation: annotation) 
    view.canShowCallout = true 
    let button = UIButton(type: .detailDisclosure) 
    button.on.tap { [weak self] in 
     self?.handleTap(annotation: annotation) 
    } 
    view.rightCalloutAccessoryView = button 
    return view 
    default: 
    return nil 
    } 
}