Wykrywanie kranu na CalloutBubble w MKAnnotationView

Im działa z MKMapView i MKAnnotationView.

mam streszczenie na mapie. Gdy użytkownik kliknie na niego, pojawia się bańka objaśnienia. Kiedy streszczenie ponownie naciśnięty (i bańki objaśnienia widoczny), muszę przejść do innego widoku.

Jak mogę wykryć drugi dźwig lub żuraw w bańki?


nie można dodać rozpoznawania gestów podczas inicjowania MKAnnotationView?

oto kod dla inside dequeueReusableAnnotationViewWithIdentifier:

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

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

to szybka wersja odpowiedzi Дхану, w tym uzyskiwanie danych od wybranego elementu do transmisji kolejnego kontrolera do następującego:

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)
}

aby nacisnąć przycisk objaśnienia po tym, jak użytkownik kliknie na widok adnotacji, dodaj UITapGestureRecognizer w didSelectAnnotationView. W ten sposób można zrealizować kliknięcie na linię wiodącą bez konieczności dodatkowych analiz.

następnie można uzyskać obiekt adnotacje z powrotem od nadawcy do 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];
    }
}

spróbuj ustawić własny obraz przycisku, bez zmiany rodzaju UIButtonTypeDetailDisclosure.

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

Swift 3 za pomocą On. Musisz poradzić sobie rightCalloutAccessoryView

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