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