【问题标题】:Multiple annotation callouts displaying in MKMapViewMKMapView 中显示的多个注释标注
【发布时间】:2026-01-26 22:00:01
【问题描述】:

是否可以同时打开多个标注?

代码:

- (void)mapViewDidFinishLoadingMap:(MKMapView *)theMapView {
    for (id<MKAnnotation> currentAnnotation in theMapView.annotations) {
        [theMapView selectAnnotation:currentAnnotation animated:YES];
    }
}

只打开一个标注。

【问题讨论】:

  • 为什么超过 1 个?屏幕尺寸不够大,这让用户感到困惑。
  • 没错,但如果地图上只有两三个大头针且它们之间的距离足够大,用户就不会感到困惑。而且,是的,这是我客户的要求。

标签: iphone mkmapview mkannotation


【解决方案1】:

请注意,MKMapView(不是MKAnnotationView)上有一个方法可以以编程方式选择注释,该方法或多或少符合您的预期:

- (void)selectAnnotation:(id < MKAnnotation >)annotation animated:(BOOL)animated

但是,它会同时自动取消选择任何当前注释,因此这并不能解决您的问题。

奇怪的是,MKMapView 上的一个属性似乎包含一组当前选定的注释:

@property(nonatomic, copy) NSArray *selectedAnnotations

但是关于这个方法的文档说:

"为这个属性分配一个新数组 选择第一个注释 仅限数组。”

只是觉得这可能很有趣。

【讨论】:

  • 可悲但真实,截至 2013 年和 iOS 6.1,它仍然如您所描述的那样。
  • @Klaas 现在是 2020 年和 iOS 13.4。我觉得还是没有解决问题
【解决方案2】:

从严格的 API 角度来看,这似乎是不可能的。

MKAnnotationView 上的 -(void)setSelected:(BOOL)selected animated:(BOOL)animated 选择器声明:“您不应该直接调用此方法。MKMapView 对象调用此方法以响应用户与注释的交互。”因此底层消息是在用户选择的全部责任下选择 annotationView 实例,并且由于用户一次只能选择其中一个,您不应该同时选择其中的几个。

即使文档说不应直接调用此方法,您是否尝试在多个 MKAnnotationView 实例上使用 setSelected:YES 调用它以查看它提供了什么?

我会做的干净的方式:(但是没有测试过自己)

  • 不要依赖 MKMapView 的选择机制
  • 子类化 MKAnnotationView 以实现自定义视图
  • 进行自定义,使标注是注释视图的一部分,以便您可以显示其中的几个。

如果你这样做,你可以同时出现几个标注气泡并得到类似的东西:

alt text http://a1.phobos.apple.com/us/r1000/048/Purple/2b/b2/ec/mzl.ttcsrlee.480x480-75.jpg

【讨论】:

  • 感谢您的回答。是的,你是对的,这可能有效。
  • 我基本上可以做到这一点,但是我的标注上有按钮,而且我似乎无法点击这些按钮。你知道这是怎么回事吗?
【解决方案3】:

自 iOS 11 起,Apple 添加了名为 MKMarkerAnnotationView 的新注释视图。

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -&gt; MKAnnotationView? 中,当您将注释视图出列时,请确保将其转换为MKMarkerAnnotationView(例如var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView),并将视图的属性titleVisibilitysubtitleVisibility 设置为.visible

【讨论】: