前言
这週想在地图页面中加入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: - GMUClusterManagerDelegateextension 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 } }