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?
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;
}
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)
}
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];
}
}
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];
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
}
}