Google地图从用户位置开始

时间:2016-12-06 02:12:18

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

我在我的应用中使用Firebase和Google地图用于用户帐户和主地图视图。在我的应用程序中,我希望它从用户的位置开始,然后让他们能够移动地图,但是有一些问题。

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

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

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

  2. 如果我的地图恰好加载并找到了用户位置,我会尝试将视图置于用户所在位置的中心位置。但是,它无法及时获取用户的位置,或者看起来如此,并且地图会加载到其他位置,并且不会更新到用户的位置。

  3. 所以这是我的问题

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

1 个答案:

答案 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

中进行检查

希望有所帮助。