Détecter Tap sur CalloutBubble dans MKAnnotationView

Je travaille avec MKMapView et MKAnnotationView.

J'ai une annotation dans la carte. Lorsque les utilisateurs tapent dessus, la bulle de légende s'affiche. Lorsque l'annotation est reprise (et que la bulle de légende est visible), je dois passer à une autre vue.

Comment puis-je détecter le deuxième robinet, ou le robinet dans la bulle?

25
demandé sur Alejandro González 2010-08-03 14:48:27

5 réponses

Pourriez-vous ajouter un reconnaisseur de geste lorsque vous initialisez le MKAnnotationView?

Voici le code à l'intérieur de dequeueReusableAnnotationViewWithIdentifier:

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

La méthode de reconnaissance des gestes:

-(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;
}
11
répondu Dolbz 2011-10-13 15:13:56

Voici la version swift de la réponse de Dhanu, y compris l'obtention des données de l'élément sélectionné pour passer au contrôleur de vue suivant:

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)
}
7
répondu Keith 2016-06-09 12:09:41

Pour appuyer sur le bouton légende après que l'Utilisateur a cliqué sur la vue Annotation, ajoutez un UITapGestureRecognizer dans didSelectAnnotationView. De cette façon, vous pouvez implémenter tap sur la légende sans avoir besoin des vues accessoires.

Vous pouvez ensuite récupérer l'objet d'annotation de l'expéditeur pour une action ultérieure.

- (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];
    }
}
6
répondu Dhanu A 2014-11-06 01:23:55

Essayez de définir une image personnalisée pour le bouton sans changer le type UIButtonTypeDetailDisclosure.

UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];        
[detailButton setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal];
4
répondu Matthieu Riegler 2015-02-24 00:34:12

Swift 3, en utilisant sur . Vous devez gérer 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
  }
}
0
répondu onmyway133 2017-07-10 21:12:18