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