style pwa icon home capable bar apps apple app ios mkmapview

ios - home - pwa safari icon



Permite tocar en cualquier parte de una anotaciĆ³n de anotaciĆ³n sin una vista de accesorio de llamada (5)

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 iOS7 y superior, esta imagen se teñirá de forma predeterminada. Si quieres mantener el icono original usa lo siguiente

[[UIImage imageNamed:@"icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]

O si quieres eliminar el icono en absoluto

[detailButton setImage:[UIImage new] forState:UIControlStateNormal];

Tengo una vista de mapa que agrega anotaciones más o menos así:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation { MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MKPinAnnotationView"]; annotationView.canShowCallout = YES; UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [detailButton addTarget:self action:@selector(handleButtonAction) forControlEvents:UIControlEventTouchUpInside]; annotationView.rightCalloutAccessoryView = detailButton; return annotationView; }

En iOS 7, esto pone un icono "i" en el lado derecho de la llamada. Al mapView:annotationView:calloutAccessoryControlTapped: el icono, se activa mapView:annotationView:calloutAccessoryControlTapped: (en el delegado) y handleButtonAction: (en sí mismo). Sin embargo, recientemente me di cuenta de que también puede tocar en cualquier otro lugar de la llamada y que se activan los mismos dos métodos.

Esto sucede con un botón de tipo UIButtonTypeDetailDisclosure pero no parece suceder con un botón UIButtonTypeCustom . El método de delegado tampoco se activa cuando toco en la llamada cuando no hay ninguna vista accesoria. (Por supuesto, ese comportamiento no es sorprendente; lo que sorprende es que si la vista accesoria es un botón de información detallada, estos dos métodos se activan independientemente de si toca el botón en sí o simplemente en otro lugar de la llamada).

Me gustaría deshacerme del botón en la llamada, o al menos reemplazarlo con un botón que muestre mi propia imagen en lugar del ícono "i", mientras que todavía permita que el usuario toque en cualquier parte de la llamada para activar mi acción . es posible? No veo un método MKMapViewDelegate que corresponda a "llamada tocada".


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


Si no necesita una indicación de toque, le aconsejaría que UITapGestureRecognizer un UITapGestureRecognizer en la llamada al momento de la creación y agregue su objeto de manejo (tal vez el controlador) como objetivo con la acción apropiada.


La solución de Dhanu A en Swift 3:

func mapView(mapView: MKMapView, didSelectAnnotationView view:MKAnnotationView) { let tapGesture = UITapGestureRecognizer(target:self, action:#selector(calloutTapped(sender:))) view.addGestureRecognizer(tapGesture) } func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) { view.removeGestureRecognizer(view.gestureRecognizers!.first!) } func calloutTapped(sender:UITapGestureRecognizer) { let view = sender.view as! MKAnnotationView if let annotation = view.annotation as? MKPointAnnotation { performSegue(withIdentifier: "annotationDetailSegue", sender: annotation) } }


- (void)mapView:(MKMapView *)mv annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { Park *parkAnnotation = (Park *)[view annotation]; switch ([control tag]) { case 0: // left button { NSURL *url = [NSURL URLWithString:parkAnnotation.link]; [[UIApplication sharedApplication] openURL:url]; } break; case 1: // right button { // build a maps url. This will launch the Maps app on the hardware, and the apple maps website in the simulator CLLocationCoordinate2D coordinate = self.locationManager.location.coordinate; NSString *url2 = [NSString stringWithFormat:@"http://maps.apple.com/maps?saddr=%f,%f&daddr=%f,%f",coordinate.latitude,coordinate.longitude,parkAnnotation.location.coordinate.latitude,parkAnnotation.location.coordinate.longitude]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url2]]; } break; default: NSLog(@"Should not be here in calloutAccessoryControlTapped, tag=%ld!",(long)[control tag]); break; } }