地图注释应聚类时会重叠

时间:2018-12-31 14:41:57

标签: ios swift mapkit mkannotation mkannotationview

我正在开发一个iOS swift应用程序,该应用程序将图像显示为地图上的注释。当多个注释重叠时,它们应聚在一起,而不是显示为图像之一。

苹果提供的群集有时无法正常工作。缩小并多次放大时,图像可能会重叠很多。

它应该是这样的: This is how it should look

出现错误时的外观如下: This is how it looks when the bug occurs

我已将示例视频上传到Youtube(https://youtu.be/kaI0bTS8_HY

有关实现的一些详细信息:

  • 我正在使用专门的MKAnnotationView:

    class PhotoAnnotationView: MKAnnotationView {
      let annotationWidth = 100
    
      var imageView = UIImageView()
    
      override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
        super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
        clusteringIdentifier = "LocatedPhoto"
        collisionMode = .circle
    
        addSubview(imageView)
        imageView.frame = annotationFrame
        frame = annotationFrame
      }
    
      var annotationFrame: CGRect {
        return CGRect(x: 0, y: 0, width: annotationWidth, height: annotationWidth)
      }
    
      override var annotation: MKAnnotation? {
        willSet {
            if let annotation = newValue as? PhotoAnnotation {
                let url = annotation.locatedPhoto.thumbnailURL
                let displayLocation = annotation.displayLocation
                setImage(url: url)
            }
        }
      }
    
      func setImage(url: URL) {
        //...
      } 
    }
    

MapViewController注册此注释类型以显示注释:

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

省略,因为我认为这不是问题的根源:  -MKClusterView(常规ClusterView中也存在此错误)  -将注释添加到地图视图

此问题的根源是什么?

1 个答案:

答案 0 :(得分:0)

PhotoAnnotationView中,您的annotation观察者应重置clusteringIdentifier

override var annotation: MKAnnotation? {
    willSet {
        if let annotation = newValue as? PhotoAnnotation {
            clusteringIdentifier = "LocatedPhoto"            // make sure to reset this
            let url = annotation.locatedPhoto.thumbnailURL
            let displayLocation = annotation.displayLocation
            setImage(url: url)
        }
    }
}

随着它们出队和重复使用,clusteringIdentifier可以被清除。再次进行设置,可以确保仍然可以进行群集。