[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(6)----关於标记丛集(Cluster Item)

前言

这周想在地图页面中加入Cluster Item的功能,如果不知道这是什麽,请右转参考法兰克写的这篇文章

导入GoogleMapsUtils失败

原本以为照着文章做一切都会很顺利,没想到光是在 import GoogleMapsUtils 的部分就卡了快半天!
以往改完Podfile文件後,再从终端机输入 pod install 和 pod update 便能导入套件,不知道为什麽偏偏在导入GoogleMapsUtils时一直报错。一度以为是版本不相容的问题,还将最低支援向上调到ios 13,但还是解决不了问题.........

後来实在没办法跑去询问了学长,才发现只要在Podfile中的target上方加入 use_frameworks! 这一行,就能顺利解决问题了,开始进行专案才发现许多恼人的bug真的都是经验不足才会踩坑呢。

以下是我实作Cluster Item的code,在初始化marker的部分是从server那取得资料,所以跟文章示范的不太依样
,想看原版的可以点上方连结。

var clusterManager : GMUClusterManager! //丛集管理器

override func viewDidLoad() {
        super.viewDidLoad()
        
        / 生成 Cluster Manager 用来管理地图上的 Cluster Item       
        //提供应用程序逻辑,以提取要在不同缩放级别使用的群集图标。
        let iconGenerator = GMUDefaultClusterIconGenerator()

        
        //指定一种算法,该算法确定标记如何聚集,例如要包括在同一聚类中的标记之间的距离。
        let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
        
        //提供用於处理地图上群集图标的实际呈现的应用程序逻辑。
        let renderer = GMUDefaultClusterRenderer(mapView: self.mapView, clusterIconGenerator: iconGenerator)
        renderer.delegate = self
        
        self.clusterManager = GMUClusterManager(map: self.mapView, algorithm: algorithm, renderer: renderer)
        
        //在GMUClusterManager实例上设置地图委托。
        self.clusterManager.setDelegate(self, mapDelegate: self)
            
//               初始化地图上的 标记丛集
        self.initMapViewMarker()
}      

    private func initMapViewMarker() {
   
        ApiHelper.instance().getByArea(ping:50,range:2){
            [weak self] (isSuccess) in
            guard let weakSelf = self else {  //如果此 weakself 赋值失败,就 return
                return
            }
            if (isSuccess){
                print("success")
                
                weakSelf.markerDataList.getMarkerDatas()
                    .map{ MyMarker(markerData: $0) }
                    .forEach {
                        let item = ClusterItem(markerData: $0.markerData)        
                        self?.clusterManager.add(item)
                        
                    }
                self?.clusterManager.cluster()
                return
            }else{
                print("failed")
                return
            }
        }
    }
    
extension MapViewController: GMUClusterRendererDelegate {
    
    /// 回传一标记,此 delegate 可用来控制标记的生命周期。例如:设定标记的座标、图片等等
    /// - Parameter renderer: _
    /// - Parameter object: _
    func renderer(_ renderer: GMUClusterRenderer, markerFor object: Any) -> GMSMarker? {
        switch object {
        case let clusterItem as ClusterItem:
            let myMarker = MyMarker(markerData: clusterItem.markerData)
            
             myMarker.snippet = clusterItem.markerData.address
                
             myMarker.icon = UIImage(named: "marker_rainbow")

           
            return myMarker
        default:
            return nil
        }
    }
    
}

// MARK: - GMUClusterManagerDelegate
extension MapViewController: GMUClusterManagerDelegate {
    
    /// 点击丛集所会触发的事件
    /// - Parameter clusterManager: _
    /// - Parameter cluster: _
    func clusterManager(_ clusterManager: GMUClusterManager, didTap cluster: GMUCluster) -> Bool {
        print("按了丛集")
        return false
    }
    
    /// 点击丛集项目所会触发的事件
    /// - Parameter clusterManager: _
    /// - Parameter clusterItem: _
    func clusterManager(_ clusterManager: GMUClusterManager, didTap clusterItem: GMUClusterItem) -> Bool {
        
        print("按了丛集项目")
        return false
    }
    
}       

<<:  Day 24 - 天眼CNN 的耳朵和嘴巴 - BERT

>>:  重要性分析和业务影响分析(criticality analysis and Business impact analysis (BIA))

JavaScript ⑅ES6:展开运算子 & 其余运算子

展开运算子及 其余运算子( 又称 其余参数 ) 他们有共通特点,那就是「 都跟阵列有关 」   写法...

[Day20] THM DogCat

URL : https://tryhackme.com/room/dogcat IP: 10.10...

风险评监三步曲

风险评监首步曲:资讯资产盘点 标题没打错呦...建立资安制度前,请先确认自已的资安范围有多大。 实务...

Day26影片教学:Azure小白如何使用Azure Container Registry异地复写建立多份Container Image

在昨天我们谈完Azure小白如何使用Azure Container Instances执行Docke...

Day17. Dynamic Programming

看完今天的文章,自己试着在专案写动态写法後,读者们会发现今天讲的东西很实用。我们可以透过动态的写法,...