我试图注册自定义注释视图(我将它们创建为MKAnnotationView的子类),但我遇到了一些麻烦。最初,我尝试使用下面的代码为单个注释标记仅注册一个自定义注释视图(RestaurantMarkerView是我的自定义注释视图):
mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
工作正常(当我点击引脚时,它会显示标注)。现在我添加另一个注释标记并尝试为它注册另一个视图,据我所知,在这种情况下我应该为视图使用自定义标识符,所以我通过以下代码执行:
mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "a")
mapView.register(ChoosenRestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "b")
现在,当我点击标记时,它们不会显示标注。当我将其中一个标记的重用标识符更改为MKMapViewDefaultAnnotationViewReuseIdentifier
时,该标记会显示标注。那么,我如何注册多个自定义注释视图?谢谢。
答案 0 :(得分:4)
正如@Paulw所说,您需要实现MKMapViewDelegate
函数mapView(_:viewFor:)
才能返回相应的视图。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation {
return nil
}
if /* condition */ {
let reuseId = "a"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
if pinView == nil {
pinView = RestaurantMarkerView(annotation: annotation, reuseIdentifier: reuseId)
pinView?.canShowCallout = true
} else {
pinView?.annotation = annotation
}
return pinView
} else {
let reuseId = "b"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
if pinView == nil {
pinView = ChoosenRestaurantMarkerView(annotation: annotation, reuseIdentifier: reuseId)
pinView?.canShowCallout = true
} else {
pinView?.annotation = annotation
}
return pinView
}
}
答案 1 :(得分:0)
在mapView.register(, forAnnotationViewWithReuseIdentifier:)
可用之前,已接受的答案是iOS11之前的正确用法,iOS11 +仍然允许使用,但答案是不正确的。
请参阅Apple的地图注释群集示例应用,可从文档中下载:https://developer.apple.com/documentation/mapkit/mkannotationview/decluttering_a_map_with_mapkit_annotation_clustering
您应该完全按照问题的第一部分注册所有注释:
mapView.register(UnicycleAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
mapView.register(BicycleAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
mapView.register(TricycleAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
它将根据您正在注册的类的名称自动生成实际的reuseIdentifier。