自定义UIView上的Google Maps GMSMapView

我想在一个视图上显示谷歌地图,然后将其添加到self.view ,而不是直接在self.view上绘制地图。 因此,我在storyboard中创建了一个视图,并将其类更改为GMSMapView 。 我还创建了一个名为gmView视图的sockets连接。

我使用以下代码,遗憾的是不显示地图:

 let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5)) gmView = mapView 

另外,我尝试将mapView添加到self.view作为子视图,如下所示:

 self.view.addSubview(mapView) 

…并插入它:

 self.view.insertSubview(mapView, at: 0) 

请注意,如果更改了任何内容,我将使用自动布局。

这些方法似乎都不适合我。
有任何想法吗?

如果要在加载view后添加mapView ,则需要创建GMSMapView的对象。 因此,打破mapView的出口,因为它将动态创建。

 import UIKit import GoogleMaps class MapViewController: UIViewController { //Take a Google Map Object. Don't make outlet from Storyboard, Break the outlet of GMSMapView if you made an outlet var mapView:GMSMapView? override func viewDidLoad() { super.viewDidLoad() mapView = GMSMapView.map(withFrame: CGRect(x: 100, y: 100, width: 200, height: 200), camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5)) //so the mapView is of width 200, height 200 and its center is same as center of the self.view mapView?.center = self.view.center self.view.addSubview(mapView!) } } 

这是输出。 mapView的宽度= 200,高度= 200,中心与self.view相同

在此处输入图像描述

我终于想出了如何在Storyboard中创建的UIView中显示地图并将其置于特定位置。

注意:创建UIViewsockets后,我将其类更改为GMSMapView,如前所述。

 import UIKit import GoogleMaps class ViewController: UIViewController { @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var toolBar: UIToolbar! @IBOutlet weak var mapView: GMSMapView! override func viewDidLoad() { super.viewDidLoad() let camera = GMSCameraPosition.camera(withLatitude: 52.520736, longitude: 13.409423, zoom: 12) self.mapView.camera = camera let initialLocation = CLLocationCoordinate2DMake(52.520736, 13.409423) let marker = GMSMarker(position: initialLocation) marker.title = "Berlin" marker.map = mapView } 

这是输出: 地图以柏林为中心

您可以在布局中放置空白UIView,并在检查器中将其类设置为GMSMapView。 您不需要以编程方式实例化它。

然后通过sockets获取参考视图并设置坐标/摄像头。

很简单。 使用以下步骤

1)打开故事板:从ViewController中的Object库中删除UIView。

2)在class上制作自定义视图sockets。 (在我的代码中查看forGMap)

3)为您的class级中的代码添加以下行。

 class GMapVC: UIViewController { @IBOutlet weak var viewForGMap: UIView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let camera = GMSCameraPosition.camera(withLatitude: 28.7041, longitude: 77.1025, zoom: 10.0) let mapView = GMSMapView.map(withFrame: self.viewForGMap.frame, camera: camera) self.view.addSubview(mapView) // Creates a marker in the center of the map. let marker = GMSMarker() marker.position = CLLocationCoordinate2D(latitude: 28.7041, longitude: 77.1025) marker.title = "Delhi" marker.snippet = "India's capital" marker.map = mapView } 

在此处输入图像描述

输出:

在此处输入图像描述

CGRect.zero将返回零高度和零宽度的视图。 它将是隐形的。

此外,如果您想要自己分配,将它添加到故事板中并没有多大意义。 您应该以编程方式创建视图控制器的属性,并将其框架设置为您想要的任何内容。

请注意,当您向视图调用“addSubview”时,它将始终添加到视图的顶部,因此无需将其插入给定索引。 使用自动布局很好,但在设置所有约束之前调用viewDidLoad()。 如果您希望能够设置mapView的frame = self.view,则需要在viewDidAppear()中执行此操作。

这是一个非常简单的方法,可以在故事板(Swift 4.2,Xcode 10)中将Google地图连接到ViewController中的View

我正在调用我的ViewController MapLocationsViewController

  1. 因此,在您的故事板中,确保ViewController上的类正确引用您正确的类(在此示例中为我提供MapLocationsViewController )。 步骤1

  2. 接下来,将View对象拖到该ViewController上,并将该类设置为GMSMapView第2步

  3. View对象挂钩到代码中的@IBOutlet(在我的示例中我将其命名为viewForGoogleMap )。 第3步

这是一个简约的示例代码:

 import UIKit import GoogleMaps class MapLocationsViewController: UIViewController { @IBOutlet weak var viewForGoogleMap: GMSMapView! override func viewDidLoad() { super.viewDidLoad() let mapView = GMSMapView(frame: self.view.bounds) viewForGoogleMap.addSubview(mapView) } } 

有关详细信息,请查看Google地图文档 。