我正在尝试使用ios11中添加到mapview的新功能。
我正在将所有MKAnnotationView与圆形碰撞聚类,但我必须在注释成为聚类时实时检查。
我不知道该怎么做。
编辑(4/1/2018):
更多信息:当我选择注释时,我会在调用didSelect方法时添加自定义CallOutView,并在调用didDeselect方法时删除CallOut。
问题是当选择注释并成为聚类时,放大注释时仍然选择但处于“正常”状态。
我想删除我选择的注释的CallOut,当它像didDeselect方法一样聚集时。
下面的截图来说明我的问题:
3 - Annotation Zoom In after cluster
我认为这只是一个理解问题。
任何帮助将非常感激。先感谢您
在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
}
}
}
//...
}
当形成新集群时,将调用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 {
}
//...
}