Ci sono due modi per rilevare l'interazione dell'utente con il tuo vista annotazione. La tecnica comune è definire un callout (quella bolla standard popover che si vede quando si tocca un pin in un'applicazione di mappe tipica) per il proprio MKAnnotationView
. E si crea la vista annotazione per l'annotazione nel metodo standard viewForAnnotation
:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
}
In questo modo, si ottiene un richiamo, ma si sta aggiungendo un accessorio destra, che è, a mio esempio di cui sopra, una rivelazione indicatore. In questo modo, toccano la vista annotazione (nell'esempio precedente, un segnaposto sulla mappa), visualizzano il callout e quando toccano l'accessorio giusto di quel callout (il piccolo indicatore di divulgazione in questo esempio), viene chiamato il tuo calloutAccessoryControlTapped
(nel mio esempio qui di seguito, l'esecuzione di un segue a qualche controllore vista di dettaglio):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
Questa è un'esperienza utente molto tipico sul piccolo schermo di iPhone.
Ma se non ti piace UX e non vuoi il callout standard, ma vuoi che succeda qualcos'altro, puoi definire il tuo MKAnnotationView
in modo che non venga mostrato un callout, ma invece intercetti e fa qualcos'altro (ad esempio, nelle app di mappe di iPad, potresti mostrare un popover più sofisticato piuttosto che il callout standard). Ad esempio, si potrebbe avere il MKAnnotationView
non mostrano una didascalia:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = NO;
return annotationView;
}
Ma si può quindi gestire manualmente didSelectAnnotationView
per rilevare quando un utente batté sul MKAnnotationView
, in questo esempio che mostra una popover:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[mapView deselectAnnotation:view.annotation animated:YES];
DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
controller.annotation = view.annotation;
self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
self.popover.delegate = self;
[self.popover presentPopoverFromRect:view.frame
inView:view.superview
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
Includo alcune istantanee dello schermo per l'interfaccia utente fornite dal codice sopra riportato in my answer here.
è necessario impostare i tag per ciascuna annotazione, in modo che quando si tocca qualsiasi annotazione è possibile ottenere l'etichetta di ritorno da annotazioni e chiamare il rispettivo membro di dati dell'array generare queste annotazioni. – yunas
- (vuoto) mapView: (MKMapView *) mapView annotationView: (MKAnnotationView *) visualizza calloutAccessoryControlTapped: (Controllo UIControl *) { NSLog (@ "got here"); } ..... Ho inserito questa funzione in tutti e tre i controller ma nessuno di essi viene chiamato .... puoi dirmi dove dovrei definire questa funzione? –