How to implement GMUClusterRenderer in Swift

后端 未结 6 532
忘了有多久
忘了有多久 2020-12-09 20:36

I am using Google Maps API for iOS and want to use marker clustering utility. I figured out how to show clustered markers, but I would like to customize markers. Can someone

6条回答
  •  离开以前
    2020-12-09 21:03

    I found a clean solution for clustered markers, on Swift 4, to use a custom image for the cluster with the number of cluster inside:

    class MapClusterIconGenerator: GMUDefaultClusterIconGenerator {
    
        override func icon(forSize size: UInt) -> UIImage {
            let image = textToImage(drawText: String(size) as NSString,
                                    inImage: UIImage(named: "cluster")!,
                                    font: UIFont.systemFont(ofSize: 12))
            return image
        }
    
        private func textToImage(drawText text: NSString, inImage image: UIImage, font: UIFont) -> UIImage {
    
            UIGraphicsBeginImageContext(image.size)
            image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
    
            let textStyle = NSMutableParagraphStyle()
            textStyle.alignment = NSTextAlignment.center
            let textColor = UIColor.black
            let attributes=[
                NSAttributedStringKey.font: font,
                NSAttributedStringKey.paragraphStyle: textStyle,
                NSAttributedStringKey.foregroundColor: textColor]
    
            // vertically center (depending on font)
            let textH = font.lineHeight
            let textY = (image.size.height-textH)/2
            let textRect = CGRect(x: 0, y: textY, width: image.size.width, height: textH)
            text.draw(in: textRect.integral, withAttributes: attributes)
            let result = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return result!
        }
    
    }
    

    Than the setup for the cluster manager:

    private func setupClustering() {
        guard let mapView = self.mapView else { return }
    
        let iconGenerator = MapClusterIconGenerator()
        let renderer = MapClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
        let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
        clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)
    }
    

    I also used a custom cluster renderer MapClusterRenderer.

提交回复
热议问题