ios mkmapview mkannotation mkannotationview

ios - Detectar Tap en CalloutBubble en MKAnnotationView



mkmapview (5)

Esta es la versión rápida de la respuesta de Dhanu, que incluye obtener datos del elemento seleccionado para pasar al siguiente controlador de vista:

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

Estoy trabajando con MKMapView y MKAnnotationView.

Tengo una anotación en el mapa. Cuando los usuarios lo tocan, se muestra el CallOut Bubble. Cuando se vuelve a tocar la anotación (y la burbuja de CallOut está visible) necesito cambiar a otra vista.

¿Cómo puedo detectar el segundo toque, o el toque en la burbuja?


Intente establecer una imagen personalizada para el botón sin cambiar el tipo de UIButtonTypeDetailDisclosure.

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


Para tocar el botón de llamada después de que el usuario haya hecho clic en la vista Anotación, agregue un UITapGestureRecognizer en didSelectAnnotationView. De esta manera puede implementar el toque en la llamada sin necesidad de las vistas accesorias.

A continuación, puede recuperar el objeto de anotación del remitente para realizar más acciones.

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


Swift 3, utilizando On . Necesitas manejar 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 } }


¿Podría agregar un reconocedor de gestos cuando está inicializando MKAnnotationView ?

Aquí está el código para dentro dequeueReusableAnnotationViewWithIdentifier:

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

El método para el reconocedor de gestos:

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