ios - Google map 从用户位置开始

标签 ios google-maps swift3 google-maps-sdk-ios

我在我的应用程序中使用 Firebase 和 Google map 作为用户帐户和主 map View 。在我的应用中,我希望它从用户的位置开始,然后让他们能够四处移动 map ,但存在一些问题。

  1. 一旦用户通过身份验证。 Firebase,我让它尝试获取用户位置,但它通常返回 nil 即使我为应用程序启用了位置服务。这是我的代码:

    if let mylocation = mapView.myLocation {
        print("User's location: \(mylocation)")
    } else {
        print("User's location is unknown")
    }
    

    这也在我的 viewDidLoad 函数中。我的 Info.plist 文件中确实有请求使用位置权限的代码以及隐私声明。

  2. 如果我的 map 恰好加载并且找到了用户位置,我会尝试让它以用户位置为中心显示 View 。但是,它无法及时获取用户的位置,或者看起来是这样,并且 map 在其他某个位置加载并且不会更新到用户的位置。

所以这是我的问题

有没有什么方法可以加载 map 并更新到用户的位置,而不会在整个应用程序使用过程中一直停留在那里?我想要的一个例子基本上是一个谷歌地图克隆,它从用户的位置开始,他们能够与 map 交互,而无需它试图将 map 始终更新到用户的位置。如果没有,有没有办法等待找到位置后再加载 map ?我尝试使用 GCD(Grand Central Dispatch),但没有用。我觉得这不是我最好的选择,在显示 map 之前等待位置加载,因为它可能会发生很多问题。如果这两个都不是选项,你会怎么做?谢谢!

最佳答案

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)
 }

不要忘记在某个地方移除你的观察者,例如deinitviewWillDisappear

deinit 
{
   self.mapView.removeObserver(self, forKeyPath: "myLocation")  
}

在此示例中,每次用户位置发生变化时, map 位置都会更新。如果您在开始时只需要该位置一次,您可以添加一个标志,如 myLocationFound 并在 observeValue:forKeyPath

中检查

希望对您有所帮助。

关于ios - Google map 从用户位置开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986708/

相关文章:

ios - 如何使用 GMSVisibleRegion 初始化 GMSCoorindateBounds

ios - 我的应用程序很简单应用程序崩溃了

arrays - 将函数放入元组会产生 "cannot convert value of type"错误

ios - 定时循环结果

javascript - 街景图像无法在 Firefox 中加载

jquery - 如何使用 jQuery 访问多维 JSON 的值并将它们绘制在 Google map 上

ios - Swift 3 - 比较日期对象

ios - 选择 WordPress REST API

ios - 更新到 Xcode 11 后,Xamarin iOS 应用程序在 iPad 上显示白色空白屏幕

ios - 使用 AutoLayout iOS 8 的 UICollectionView 单元格自动调整大小