当前位置: 首页 > 面试题库 >

如何在Swift中实现GMUClusterRenderer

卢黎明
2023-03-14
问题内容

我正在使用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



 类似资料:
  • 问题内容: 问题 注释 我在计算范围中的元素数量等时遇到问题… 问题答案: 范围中的值是,因此您只能使用它们或计算,但是未定义减法。预付款必须是相应的类型。因此,这可能是一种实现: 例: 但是请注意,这不是整数列表(或数组)。要将 数组 拆分为子 数组 ,可以定义类似的扩展名: 例: 一种更通用的方法是拆分所有 可切片 对象。但 是 协议 和协议不能扩展。你可以做的反而是定义一个 函数 ,是以可切

  • 我是斯威夫特编程新手,请告诉我如何用代码在斯威夫特实现单例类。 在obj-c中我知道 斯威夫特怎么样

  • 问题内容: 这是推特的一些代码和平…我想知道如何像在iOS堆栈照片应用程序中一样获得共享操作视图… 问题答案:

  • 问题内容: 我已经在Swift中实现了一个使用字典键的Set。我想实现一个addAll(sequence)方法,该方法在Set中的Elements上采用任何序列类型,但是出现一个没有意义的错误。这是我的代码 我在XCode 6.1和6.0.1中遇到此错误。 我想遵循Array的extend方法的语义,但是该类型签名甚至不为我编译。 我做错了什么,还是应该提交雷达? 编辑 :刚刚找到https://

  • 问题内容: 如何在 Swift 3.0中 实现方法混乱? 我已经阅读了有关nshipster的文章,但是在这段代码中 编译器给我一个错误 在Swift中不可用dispatch_once_t:而是使用延迟初始化的全局变量 问题答案: 首先,在Swift 3.0中不可用。您可以选择两种选择: 全局变量 静态财产,或 令人毛骨悚然的CocoaTouch类,例如UIViewController; 定制的S

  • 问题内容: 我最近开始使用Swift来构建OS X应用程序,我想知道如何实现拖放区域。 更具体地说,我构建了一个处理图像的应用程序,但目前,用户必须手动输入输入图像的路径或使用文件选择器(这很烦人)。我想改进我的应用程序,允许用户通过简单的拖放输入图像(我只需要检索表示图像路径的String即可)。 我怎样才能做到这一点? 问题答案: 这是我在应用程序中使用的示例。 如有必要,将一致性添加到子类声