有两种方法可以检测用户与注释视图的交互。常见的技术是为您的MKAnnotationView
. 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;
}
通过这样做,你会得到一个标注,但你正在添加一个正确的附件,在我上面的示例中,它是一个披露指示器。这样,他们点击您的注释视图(在我上面的示例中,地图上的一个图钉),他们会看到标注,并且当他们点击该标注的正确附件(本示例中的小披露指示器)时,您calloutAccessoryControlTapped
被称为 (在下面的示例中,对某些详细视图控制器执行 segue):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
这是 iPhone 小屏幕上非常典型的用户体验。
但是,如果您不喜欢那个 UX 并且您不想要标准标注,而是希望发生其他事情,您可以定义您的MKAnnotationView
以便不显示标注,而是拦截它并执行其他操作(例如,在 iPad 地图应用程序上,您可能会显示一些更复杂的弹出框而不是标准标注)。例如,您可以MKAnnotationView
不显示标注:
- (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;
}
但是您可以手动处理didSelectAnnotationView
以检测用户何时点击了您的MKAnnotationView
,在此示例中显示了一个弹出框:
- (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];
}
我在此处的回答中包含了由上述代码生成的用户界面的一些屏幕快照。