自定义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
。
-
因此,在您的故事板中,确保
ViewController
上的类正确引用您正确的类(在此示例中为我提供MapLocationsViewController
)。 -
接下来,将
View
对象拖到该ViewController上,并将该类设置为GMSMapView
。 -
将
View
对象挂钩到代码中的@IBOutlet(在我的示例中我将其命名为viewForGoogleMap
)。
这是一个简约的示例代码:
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地图文档 。