是否可以显示MKClusterAnnotation标注?

时间:2017-11-10 05:34:21

标签: ios11

注意:我使用的是iOS11s原生mapview注释聚类。

在注释仍然以最大缩放聚类的情况下,我们可以以什么方式显示标注?

我正在显示一个弹出式类型视图,以显示群集中的注释列表,但调用selectAnnotation不足以显示“群集”注释的标注。

选择“Something”,但不显示标注。通过某种方式,我的意思是在触摸mapview后调用我的didDeselect view方法。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。在这种情况下,他们似乎没有仔细考虑过。您必须选择MKClusterAnnotation而不是群集的MKAnnotation,但要实现它并不容易。

在iOS11上,MKAnnotationView上有一个名为cluster的属性,正如文档所述:

If non-nil this is the annotation view this view is clustered into.

因此,在我的MKAnnotationView子类中,我覆盖了setSelected方法,并且对mapView的弱引用必须选择群集一:

//You have weak reference to mapView
weak var mapView: MKMapView?

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    if #available(iOS 11.0, *) {
        if selected, let cluster = cluster {
            // Deselect the current annotation (Maybe this step is not required, didn't check it)
            if let annotation = annotation {
                mapView?.deselectAnnotation(annotation, animated: false)
            }
            // Select the cluster annotation
            if let clusterAnnotation = cluster.annotation {
                mapView?.selectAnnotation(clusterAnnotation, animated: true)
            }
        }
    }
}

答案 1 :(得分:0)

实际上很简单。如果未将分配的MKMarkerAnnotationView设置为通过.canShowCallout显示标注,并且视图上没有附件(这很重要),则地图视图不会显示标注。如果不满足这两个条件,则地图可以在图钉本身上显示标题和副标题。所以,这就是您要做的一切:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{   

    if annotation is MyAnnotationConformingClass {
       let annotation = annotation as! MKAnnotation

       let view = MKAannotationView(annotation: annotation, reuseIdentifier: "pinReUserId")
       view.canShowCallout = true
       view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
       return view
    }

    if annotation is MKClusterAnnotation {
        let annotation = annotation as! MKClusterAnnotation
        let view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "ClusterResuseId")
        view.canShowCallout = true
        view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        return view
    }

    return nil
}

通过为集群的MKMarkerAnnotationView提供附件并允许显示标注,将显示标注。如果您还记得较早的SDK,如果您未设置标题和字幕,则地图不会显示标注。