我在我的应用中使用Firebase和Google地图用于用户帐户和主地图视图。在我的应用程序中,我希望它从用户的位置开始,然后让他们能够移动地图,但是有一些问题。
用户通过身份验证后。 Firebase,我尝试获取用户位置,但即使我为应用启用了位置服务,它也会返回nil
。这是我的代码:
if let mylocation = mapView.myLocation {
print("User's location: \(mylocation)")
} else {
print("User's location is unknown")
}
这也在我的viewDidLoad
功能中。我确实有代码请求使用位置以及我的Info.plist文件中的隐私声明。
如果我的地图恰好加载并找到了用户位置,我会尝试将视图置于用户所在位置的中心位置。但是,它无法及时获取用户的位置,或者看起来如此,并且地图会加载到其他位置,并且不会更新到用户的位置。
所以这是我的问题
是否有任何方法可以加载地图并将其更新到用户的位置,而不会因为整个应用程序的使用而被卡在那里?我想要的一个例子基本上是一个谷歌地图克隆,它从用户的位置开始,他们能够与地图互动,而不会试图一致地将地图更新到用户的位置。如果没有,有没有办法在加载地图之前等待找到位置?我尝试使用GCD(Grand Central Dispatch),但这不起作用。我觉得这不是我最好的选择,在显示地图之前等待加载位置,因为它可能会发生很多问题。如果这些都不是选项,你会做什么?谢谢!
答案 0 :(得分:2)
如果启用了“我的位置”,则会显示用户位置点的位置 画。如果已禁用,或者已启用但没有可用的位置数据, 这将是零。使用KVO可以观察到这个属性。
由于可以通过KVO观察到windowLevel
myLocation
以观察此值,因此可以解决您的问题。
这里有一些示例代码:
添加GMSMapView
作为self
实例的myLocation
属性的观察者。
GMSMapView
您可以在此处理更改:
self.mapview.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil)
别忘了删除你的观察者,例如override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let update = change, let myLocation = update[NSKeyValueChangeKey.newKey] as? CLLocation else {
return
}
self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: self.defaultTrackingZoom)
}
或deinit
viewWillDisappear
在此示例中,每次用户位置更改时,地图位置都会更新。如果您在开始时只需要一次该位置,则可以添加deinit
{
self.mapView.removeObserver(self, forKeyPath: "myLocation")
}
之类的标记,并在myLocationFound
希望有所帮助。