如何检查注释是否已群集(MKMarkerAnnotationView和Cluster)

问题描述 投票:1回答:2

我正在尝试使用ios11中添加到mapview的新功能。

我正在将所有MKAnnotationView与圆形碰撞聚类,但我必须在注释成为聚类时实时检查。

我不知道该怎么做。

编辑(4/1/2018):

更多信息:当我选择注释时,我会在调用didSelect方法时添加自定义CallOutView,并在调用didDeselect方法时删除CallOut。

问题是当选择注释并成为聚类时,放大注释时仍然选择但处于“正常”状态。

我想删除我选择的注释的CallOut,当它像didDeselect方法一样聚集时。

下面的截图来说明我的问题:

1 - Annotation Selected

2 - Annotation Clustered

3 - Annotation Zoom In after cluster

我认为这只是一个理解问题。

任何帮助将非常感激。先感谢您

swift mkmapview ios11 mkannotation mkannotationview
2个回答
2
投票

在iOS 11中,Apple还在MKMapViewDelegate中引入了一个新的回调:

func mapView(_ mapView: MKMapView, clusterAnnotationForMemberAnnotations memberAnnotations: [MKAnnotation]) -> MKClusterAnnotation

在注释成为聚类之前,将调用此函数来为MKClusterAnnotation请求memberAnnotations。因此,名为memberAnnotations的第二个参数表示要聚类的注释。

编辑(4/1/2018):

集群注释有两个关键步骤:

首先,在注释成为聚类之前,MapKit调用mapView:clusterAnnotationForMemberAnnotations:函数来为memberAnnotations请求MKClusterAnnotation。

其次,MapKit将MKClusterAnnotation添加到MKMapView,并调用mapView:viewForAnnotation:函数来生成MKAnnotationView。

因此,您可以在以下两个步骤中取消选择注释,如下所示:

var selectedAnnotation: MKAnnotation? //the selected annotation

 func mapView(_ mapView: MKMapView, clusterAnnotationForMemberAnnotations memberAnnotations: [MKAnnotation]) -> MKClusterAnnotation {
     for annotation in memberAnnotations {
         if annotation === selectedAnnotation {
             mapView.deselectAnnotation(selectedAnnotation, animated: false)//Or remove the callout
         }
     }

     //...
 }

要么:

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
     if let clusterAnnotation = annotation as? MKClusterAnnotation {
         for annotation in clusterAnnotation.memberAnnotations {
             if annotation === selectedAnnotation {
                 mapView.deselectAnnotation(selectedAnnotation, animated: false)//Or remove the callout
             }
         }
     }

     //...
 }

3
投票

当形成新集群时,将调用mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?来请求该集群的新视图。

你可以像这样检查:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    //...
    if annotation is MKClusterAnnotation {
        //This is your new cluster.
    }
    //Alternatively if you need to use the values within that annotation you can do
    if let cluster = annotation as? MKClusterAnnotation {

    }
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.