How to implement GMUClusterRenderer in Swift

后端 未结 6 551
忘了有多久
忘了有多久 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:11

    In Swift 4.2 :

    you can use GMUClusterRendererDelegate:

    Add this extension to your controller and be sure that your controller is the delegate of GMUClusterRendererDelegate :

    willRenderMarker will call each time a marker going to be render (both cluster marker and clusterItemMarker so you can check it by simple if).so you can modify it's icon and etc before showing it to user

    extension YourController: GMUClusterRendererDelegate {
        func renderer(_ renderer: GMUClusterRenderer, willRenderMarker marker: GMSMarker) {
            // if your marker is pointy you can change groundAnchor
            marker.groundAnchor = CGPoint(x: 0.5, y: 1)
            if  let markerData = (marker.userData as? PersonMarker) {
               let icon = markerData.imageURL
               marker.iconView = CustomMarkerView(forUrl: url)
            }
        }
    }
    

    And PersonMarker is your marker class that subclass NSObject and GMUClusterItem : (you can use default class of GMUClusterItem but if you need some other properties you can subclass it)

    class PersonMarker: NSObject, GMUClusterItem {
    
      var position: CLLocationCoordinate2D
      var imageURL : String?
      var name: String?
      var userdId: String?
      var lastSeen: String?
    
      init(position: CLLocationCoordinate2D, url: String?, name: String?, userId: String?, lastSeen: String?) {
          self.position = position
          self.imageURL = url
          self.name = name
          self.userdId = userId
          self.lastSeen = lastSeen
      }
    
    }
    

    You can add PersonMarker to your GMUClusterManager like this :

     let position = CLLocationCoordinate2D(latitude: item.latitude!, longitude: item.longitute!)
     let person = PersonMarker(position: position, url: item.user?.avaterUrl, name: item.user?.name, userId: item.user?.userId, lastSeen: item.lastUpdate)
     clusterManager.add(person)
    

提交回复
热议问题