在用户位置更新时停止地图更新 - Google 地图 iOS SDK

Stop Map Updating on User Location Update - Google Maps iOS SDK

我的应用程序在用户的位置启动,但是,每次用户移动地图的相机更新到他们的位置。我希望它加载到他们的位置,然后允许他们自由浏览地图,即使他们的位置在移动。类似于 Google 地图应用中展示的行为。我正在使用 KVO 来收集 viewDidLoad() 函数中的位置。该行看起来像这样:

mapView.isMyLocationEnabled = true
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 {
        print("Location not found")
        return
    }

    self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14)

}

需要更改什么才能满足上述条件。

使用 this 帮助程序代码,您可以获得用户的位置并设置目标,如:

CLLocationManager *manager = [CLLocationManager updateManagerWithAccuracy:50.0 locationAge:15.0     authorizationDesciption:CLLocationUpdateAuthorizationDescriptionAlways];
    [self.manager startUpdatingLocationWithUpdateBlock:^(CLLocationManager *manager, CLLocation *location, NSError *error, BOOL *stopUpdating) {
    self.mapView.camera = GMSCameraPosition.camera(withTarget: location.coordinate, zoom: 14)
}]; 

如果您不想使用上述帮助代码,那么您也可以获取用户的位置 using Core Location basic api

请注意,每次用户位置更改时,您的代码都会调用 observeValue,这会导致为用户的位置图设置摄像头。

在 Sunil 上面的回答的帮助下,我想出了解决这个问题的方法。

Sunil 指出,每次更新用户位置时,该应用都会调用 observeValue()。因此,根据我在 observeValue() 中的代码,mapView 相机会在每次用户位置更新时更新。

我通过移动

解决了问题
self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14)

到另一个函数,如 viewDidAppear()

有些人可能会问我为什么不把它移到 viewDidLoad(),因为它在 viewDidAppear() 之前被调用。在 viewDidLoad() 结束之前,应用程序不会获取用户的位置。因此,将相机声明放在 viewDidLoad() 的末尾不会给应用足够的时间来获取用户位置。通过在 viewDidAppear() 函数中声明相机位置,我们为应用程序提供了充足的时间来处理用户的位置并获取它。

注意:确保将您的位置变量传递到 observeValue() 函数之外,以便在 viewDidAppear().

中使用