I try to use SwiftUI view using the UIViewRepresentable pattern, the GoogleMaps background works but the ClusterManager doesn't show anything. Is there something wrong?
I try to generate 10000 markers like in the sample of Google Maps documentation, but instead of using UIKit with "UIViewController" I try to use SwiftUI with UIViewRepresentable just like they did there. It works if I just use markers but if I try to use ClusterManager it doesn't work.
import SwiftUI
import GoogleMaps
import GoogleMapsUtils
struct GoogleMapsView: UIViewRepresentable {
let kClusterItemCount = 10000
let kCameraLatitude = 48.860294
let kCameraLongitude = 2.338629
func makeUIView(context: Self.Context) -> GMSMapView {
print("-- GoogleMapsView -- : Making UiView MapView")
let camera = GMSCameraPosition.camera(withLatitude: kCameraLatitude,
longitude: kCameraLongitude, zoom: 10)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
return mapView
}
func makeCoordinator() -> MapCoordinator {
print("-- GoogleMapsView -- : Making Coordinator")
return MapCoordinator(owner: self)
}
func updateUIView(_ mapView: GMSMapView, context: Context) {
print("-- GoogleMapsView -- : Updating UI View")
let iconGenerator = GMUDefaultClusterIconGenerator()
let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
let clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)
generateClusterItems(clusterManager: clusterManager)
clusterManager.cluster()
}
private func generateClusterItems(clusterManager : GMUClusterManager) {
let extent = 0.2
for _ in 1...kClusterItemCount {
let lat = kCameraLatitude + extent * randomScale()
let lng = kCameraLongitude + extent * randomScale()
let position = CLLocationCoordinate2D(latitude: lat, longitude: lng)
let marker = GMSMarker(position: position)
clusterManager.add(marker)
}
}
/// Returns a random value between -1.0 and 1.0.
private func randomScale() -> Double {
return Double(arc4random()) / Double(UINT32_MAX) * 2.0 - 1.0
}
}
You are creating
clusterManager
insideupdateUIView
but not saving it anywhere, so it’s immediately discarded. In the Google sample code, they saveclusterManager
as a property of the view controller; you don’t have a view controller, so I’d recommend movingclusterManager
and related code into yourMapCoordinator
class. Coordinators are kept around for the lifetime of your view and can be accessed frommakeUIView
andupdateUIView
usingcontext.coordinator
.