使用 Google 地图 SDK 子视图 (Swift) 居中地图并添加标记

Center Map and Add Marker with Google Map SDK Subview (Swift)

当它是作为 IBOutlet 连接的子视图时,我无法让 Google 地图自行居中并添加标记。我已经尝试让它工作,感觉就像 20 种不同的方式,但我卡住了,所以非常感谢任何帮助或指导。

代码设置非常简单,如下所示:

//Map view outlet
@IBOutlet weak var googleMapView: GMSMapView!

override func viewDidLoad() {
    super.viewDidLoad()

// Google Map View Setup
    let camera = GMSCameraPosition.cameraWithLatitude(-33.86, longitude: 151.20, zoom: 6)
    let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
    mapView.myLocationEnabled = true

    self.googleMapView = mapView

    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20)
    marker.title = "Sydney"
    marker.snippet = "Australia"
    marker.map = mapView

如果视图是整个视图控制器,我可以通过将 self.googleMapView 更改为 self.view 来让它工作,但我不知道如何让它正确连接到 googleMapView 插座.谢谢!

我尝试使用为此 提供的帮助,但没有明确回答,因为出口和变量都是 mapView,我无法让它工作。

当然,在我向这里的每个人提出问题后,我突然顿悟并想通了!我不需要创建新的 GMSMapView,因为这已经通过自动布局完成了。我只需要访问那个 GMSMapView Outlet 的相机变量来设置位置。

代码如下:

 // Google Map View Setup
    let camera = GMSCameraPosition.cameraWithLatitude(-33.86, longitude: 151.20, zoom: 6)
    self.googleMapView.myLocationEnabled = true

    self.googleMapView.camera = camera

    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20)
    marker.title = "Sydney"
    marker.snippet = "Australia"
    marker.map = googleMapView

我认为您的 mapView 边界未正确设置为 viewDidLoad() 函数中的视图出口。所以你可以设置 mapView 边界 func viewDidAppear(animated: Bool)。我遇到了同样的问题,即 google 地图正确地以 self.view 为中心,而不是以自定义视图为中心 bounds.We 找到了 func viewDidLoad( ),我们无法正确获取视图的矩形边界。

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        googleMapsView = GMSMapView()
        googleMapsView?.frame = mapView.bounds
        googleMapsView?.myLocationEnabled = true
        if let googleMapView = googleMapsView {
            mapView.addSubview(googleMapView)
        }
  }

您需要在 viewDidAppear() 中设置标记和重新定位,因为您的 GMSMapView 边界已在此函数中正确计算。

示例:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // Add Marker
    let marker = GMSMarker()
    marker.title = "Marker Title Here"
    marker.position = CLLocationCoordinate2DMake(location.latitude, location.longitude)
    marker.map = mapView

    // Center camera to marker position
    mapView.camera = GMSCameraPosition.camera(withTarget: marker.position, zoom: 15)
}