Google 地图从用户位置开始
Google Maps Start at User Location
我在我的应用程序中为用户帐户和主地图视图使用 Firebase 和 Google 地图。在我的应用程序中,我希望它从用户的位置开始,然后让他们能够四处移动地图,但存在一些问题。
一旦用户通过验证。 Firebase,我让它尝试获取用户位置,但它通常 returns nil
即使我为应用程序启用了位置服务。这是我的代码:
if let mylocation = mapView.myLocation {
print("User's location: \(mylocation)")
} else {
print("User's location is unknown")
}
这也在我的 viewDidLoad
函数中。我的 Info.plist 文件中确实有请求使用位置权限的代码以及隐私声明。
如果我的地图恰好加载并且找到了用户位置,我会尝试让它以用户位置为中心显示视图。但是,它无法及时获取用户的位置,或者看起来是这样,并且地图在其他某个位置加载并且不会更新到用户的位置。
所以这是我的问题
有没有什么方法可以加载地图并更新到用户的位置,而不会在整个应用程序使用过程中一直停留在那里?我想要的一个例子基本上是一个 Google 地图克隆,它从用户的位置开始,他们能够与地图交互,而无需尝试将地图始终更新到用户的位置。如果没有,有没有办法等待找到位置后再加载地图?我尝试使用 GCD(Grand Central Dispatch),但没有用。我觉得这不是我最好的选择,在显示地图之前等待位置加载,因为它可能会发生很多问题。如果这两个都不是选项,你会怎么做?谢谢!
If My Location is enabled, reveals where the user location dot is being
drawn. If it is disabled, or it is enabled but no location data is available,
this will be nil. This property is observable using KVO.
因为 GMSMapView
上的 myLocation
可以用 KVO 观察到,观察这个值应该可以解决你的问题。
这里有一些示例代码:
添加 self
作为 GMSMapView
实例的 myLocation
属性 的观察者。
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
这样的标志,并在 observeValue:forKeyPath
中检查它
希望对您有所帮助。
我在我的应用程序中为用户帐户和主地图视图使用 Firebase 和 Google 地图。在我的应用程序中,我希望它从用户的位置开始,然后让他们能够四处移动地图,但存在一些问题。
一旦用户通过验证。 Firebase,我让它尝试获取用户位置,但它通常 returns
nil
即使我为应用程序启用了位置服务。这是我的代码:if let mylocation = mapView.myLocation { print("User's location: \(mylocation)") } else { print("User's location is unknown") }
这也在我的
viewDidLoad
函数中。我的 Info.plist 文件中确实有请求使用位置权限的代码以及隐私声明。如果我的地图恰好加载并且找到了用户位置,我会尝试让它以用户位置为中心显示视图。但是,它无法及时获取用户的位置,或者看起来是这样,并且地图在其他某个位置加载并且不会更新到用户的位置。
所以这是我的问题
有没有什么方法可以加载地图并更新到用户的位置,而不会在整个应用程序使用过程中一直停留在那里?我想要的一个例子基本上是一个 Google 地图克隆,它从用户的位置开始,他们能够与地图交互,而无需尝试将地图始终更新到用户的位置。如果没有,有没有办法等待找到位置后再加载地图?我尝试使用 GCD(Grand Central Dispatch),但没有用。我觉得这不是我最好的选择,在显示地图之前等待位置加载,因为它可能会发生很多问题。如果这两个都不是选项,你会怎么做?谢谢!
If My Location is enabled, reveals where the user location dot is being drawn. If it is disabled, or it is enabled but no location data is available, this will be nil. This property is observable using KVO.
因为 GMSMapView
上的 myLocation
可以用 KVO 观察到,观察这个值应该可以解决你的问题。
这里有一些示例代码:
添加 self
作为 GMSMapView
实例的 myLocation
属性 的观察者。
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
这样的标志,并在 observeValue:forKeyPath
希望对您有所帮助。