如何注册两个或多个自定义注释视图?

时间:2017-10-29 23:48:53

标签: ios swift mapkit mapkitannotation

我试图注册自定义注释视图(我将它们创建为MKAnnotationView的子类),但我遇到了一些麻烦。最初,我尝试使用下面的代码为单个注释标记仅注册一个自定义注释视图(RestaurantMarkerView是我的自定义注释视图):

 mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

工作正常(当我点击引脚时,它会显示标注)。现在我添加另一个注释标记并尝试为它注册另一个视图,据我所知,在这种情况下我应该为视图使用自定义标识符,所以我通过以下代码执行:

  mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "a")
  mapView.register(ChoosenRestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "b")

现在,当我点击标记时,它们不会显示标注。当我将其中一个标记的重用标识符更改为MKMapViewDefaultAnnotationViewReuseIdentifier时,该标记会显示标注。那么,我如何注册多个自定义注释视图?谢谢。

2 个答案:

答案 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。

相关问题