MKAnnotationView:在notesView下面有文本并呈现该View

时间:2018-07-06 14:40:04

标签: ios swift mapkit mapkitannotation

当我继承MKMarkerAnnotationView的子类时,我会在MarkerView下方免费获得这些漂亮的文本,显示标题和副标题。

当我继承MKAnnotationView的子类时,我完全可以自由地呈现注释视图:

internal final class POIClusterView: MKAnnotationView {

override var annotation: MKAnnotation? {
    willSet {
        // render
        let renderer = UIGraphicsImageRenderer(size: CGSize(width: 40, height: 40))
        self.image = renderer.image { _ in

        ...
        }
    }
}

这很好。但是它不会像MKMarkerAnnotationView下方显示标题和副标题。

如果我继承MKMarkerAnnotationView并渲染自己的图像,则会在下面看到这些文本,但是MKMarkerAnnotationView气泡会显示在我自己的图像上方。

我怎么都可以:渲染自己的图像并免费获得下面的文本?

最直接的想法可能是以某种方式关闭MKMarkerAnnotationView气泡的呈现,但是我该怎么做?

1 个答案:

答案 0 :(得分:0)

经过一些实验,我找到了一个简单的解决方案

// Inherit from MKMarkerAnnotationView to get the texts below the annotation for free
class POIMarkerClusterView: MKMarkerAnnotationView {
    override var annotation: MKAnnotation? {
        willSet {
            if let cluster = newValue as? MKClusterAnnotation {
                // set properties as usual
                // MKMarkerAnnotationView renders title and subtitle in the callout view 
                // and below the image if and where there is space:
                cluster.title = firstPoi.title
                if sortedPOIs.count == 2 {
                    cluster.subtitle = sortedPOIs.last?.title
                } else {
                    // default: MapKit shows something like "+2 more" and localizes it for us
                }

                // calculate statistics to render

                // render own image
                self.image = POIClusterImage(cityModel: cityModel, poiStatistics: poiStatistics, count: count)

                // MKMarkerAnnotationView's default rendering usually hides our own image.
                // so we make it invisible:
                self.glyphText = ""
                self.glyphTintColor = UIColor.clear
                self.markerTintColor = UIColor.clear

            }
        }
    }
}