我正在使用iOS的Google Maps API,并想使用标记聚类实用程序。我想出了如何显示聚簇标记,但是我想自定义标记。有人可以解释如何设置/更改每个标记或群集标记的图标和标题吗?示例代码将非常有帮助。
class POIItem: NSObject, GMUClusterItem { var position: CLLocationCoordinate2D var name: String! init(position: CLLocationCoordinate2D, name: String) { self.position = position self.name = name } } class MyRenderer: NSObject, GMUClusterRenderer { var mapView: GMSMapView var clusterIconGenerator: GMUClusterIconGenerator var clusterManager: GMUClusterManager init(mapView: GMSMapView, clusterIconGenerator: GMUClusterIconGenerator, clusterManager: GMUClusterManager) { self.mapView = mapView self.clusterIconGenerator = clusterIconGenerator self.clusterManager = clusterManager } func renderClusters(clusters: [GMUCluster]) { } func update() { } }
到目前为止,这就是我所拥有的。我不知道该如何处理renderClusters和更新函数。
在 Swift 4上 ,我找到了一种针对聚簇标记的干净解决方案,可以为聚簇使用自定义图像,并在其中包含聚簇数:
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! } }
比集群管理器的设置:
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) }
我还使用了自定义群集渲染器MapClusterRenderer。
MapClusterRenderer