Istnieją dwa sposoby wykrywania interakcji użytkownika z widoku opisu. Powszechną techniką jest zdefiniowanie objaśnienia (tej standardowej małej bańki popover, którą widzisz po kliknięciu pinezki w typowej aplikacji mapowej) dla swojej MKAnnotationView
. I utworzeniu widoku opisu dla adnotacji w standardowej metodzie 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;
}
W ten sposób można uzyskać objaśnienie, ale jesteś dodając odpowiednie akcesoria, które jest, w moim przykładzie powyżej, ujawnienia wskaźnik. W ten sposób dotkną twojego widoku adnotacji (w moim przykładzie powyżej, pinezkę na mapie), zobaczą objaśnienie, a kiedy klikną na odpowiednie akcesorium objaśnienia (ten mały wskaźnik ujawnienia w tym przykładzie), twoja calloutAccessoryControlTapped
jest nazywana (w moim przykładzie poniżej, wykonując segue do jakiegoś szczegółu widoku kontrolera):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
to bardzo typowe doświadczenia użytkownika na ekranie małego iPhone.
Ale jeśli nie podoba ci się ten UX i nie chcesz standardowego objaśnienia, ale chcesz, aby coś innego się wydarzyło, możesz zdefiniować swój MKAnnotationView
, aby nie wyświetlać objaśnienia, ale zamiast tego przechwycić to i zrób coś innego (na przykład na aplikacjach do map na iPada możesz pokazać bardziej wyrafinowany popover zamiast standardowego objaśnienia). Na przykład, można mieć swój MKAnnotationView
nie wykazują objaśnienie:
- (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;
}
Ale można następnie ręcznie obsługiwać didSelectAnnotationView
wykryć, kiedy użytkownik podsłuchu na MKAnnotationView
w tym przykładzie pokazano 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];
}
Dołączam kilka migawek ekranu dla interfejsu użytkownika uzyskanych przez powyższy kod w my answer here.
trzeba ustawić znaczniki dla każdej adnotacji, tak że po dotknięciu żadnej adnotacji można uzyskać tag z powrotem z adnotacją i wywołać odpowiedni element danych z tablicy generowanie tych adnotacji. – yunas
- (void) mapView: (MKMapView *) mapView annotationView: (MKAnnotationView *) view calloutAccessoryControlTapped: (UIControl *) control { NSLog (@ "tutaj"); } ..... Umieszczam tę funkcję we wszystkich trzech kontrolerach, ale żaden z nich nie jest wywoływany ... czy możesz mi powiedzieć, gdzie powinienem zdefiniować tę funkcję? –