【问题标题】:Google Maps Start at User Location谷歌地图从用户位置开始
【发布时间】:2016-12-06 02:12:17
【问题描述】:

我在我的应用中为用户帐户和主地图视图使用 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. 如果我的地图恰好加载并找到了用户位置,我会尝试让它以用户位置为中心显示视图。但是,它无法及时获取用户的位置,或者看起来如此,并且地图会在其他位置加载,并且不会更新到用户的位置。

这是我的问题

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

【问题讨论】:

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


    【解决方案1】:

    如果启用“我的位置”,则显示用户位置点所在的位置 画。如果它被禁用,或者它被启用但没有可用的位置数据, 这将为零。使用 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")  
    }
    

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

    希望对您有所帮助。

    【讨论】:

    • 所以当我启动应用程序时只需要位置,这对保护语句有什么影响?我需要一个全新的吗?另外,我是否需要在我的 deinit 中删除 myLocationFound 观察者?
    • 您也可以使用CLLocationManager 获取位置。一旦您获得第一个位置更新,请停止管理器并使用该 CLLocation 对象。如果您喜欢使用我的第一个建议,您可以禁用位置检测mapView.isMyLocationEnabled = false
    • 我仍然希望显示用户位置。在我之前的评论中,我指的是您答案的最后一部分。我将如何去做。我为myLocationFound 添加了标志,但我不知道如何让地图相机在用户每次移动时都不更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多