如何在程序中通过编程方式打开呼叫MKAnnotationView?(iPhone,MapKit)

27

我想要以编程的方式展开MKPinAnnotationView的呼出框。例如,我在地图上放置了10个标注,想要打开离我最近的一个。我该如何做到这一点?

Apple已经为MKAnnotationView指定了“selected”参数,但不鼓励直接设置它(尝试过后发现无效)。

对于其余部分,MKAnnotationView仅具有setHighlighted方法(同样的故事),以及ShowCallout方法。

请问这是否可能实现?

2个回答

82
在你的`mapViewController`中创建一个动作方法:
- (void)openAnnotation:(id)annotation 
{
    //mv is the mapView
    [mv selectAnnotation:annotation animated:YES];

}

你可以根据当前位置,遍历数组中可用的注释,并确定最接近的注释。

[mv annotations];

一旦计算出最接近的注解,调用:

[self openAnnotation:closestAnnotation];

地图视图应该自动滚动,以便将您的注释放置在显示区域的中心位置。


感谢 Nate 修正了这个错别字。 - Chip Coons
1
如果您知道要以编程方式选择的注释将在地图视图的可见区域内,则可以使用[mv annotationsInMapRect:mv.visibleMapRect]。如果您正在处理大量地图注释,则这将提供更高的性能水平。 - John Erck
True。自从提供这个答案以来,MapKit API已经扩展了。annotationsInMapRect:在iOS 4.2中添加。 - Chip Coons

1
在 Swift 3 中,更新为:


func openAnnotation(annotation: MkAnnotation) {
_ = [mapView .selectAnnotation(annotation, animated: true)]
}

任何注释都可以调用(这将打开注释弹出视图并尝试将注释居中于地图上)。

例如,在假设的注释列表中使用第二个注释。

openAnnotation(annotation: mapView.annotations[1])

3
您的代码是Objective-C(方括号)和Swift的奇怪混合。为什么要创建一个数组然后丢弃它? - Code Different

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接