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

问题描述:

但是,每当用户将地图的相机更新移动到其位置时,我的应用程序都会在用户位置启动。我希望它能够加载到它们的位置,但是即使它们的位置正在移动,也可以让它们*浏览地图。类似于Google地图应用中显示的行为。我正在使用KVO来收集viewDidLoad()函数中的位置。该行看起来是这样的:停止地图更新用户位置更新 - Google Maps iOS SDK

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) 

} 

什么需要改变,以使其符合上述标准。

+0

一旦获取了myLocation的值,就可以删除观察者。因此,它会在地图上定位您的位置,然后不会再像以下那样更换摄像机:'observeValue()'方法底部的'self.mapView.removeObserver(self)'。 –

+0

@SunilChauhan这给了我以下错误:**终止应用程序,由于未捕获的异常'NSInternalInconsistencyException',原因:'类GMSMapView的实例0x101f30160被释放,而键值观察员仍然注册它。当前观察信息: Context:0x0,Property:0x174054940> ) * –

在Sunil的答案帮助下,我想出了如何解决这个问题。

Sunil指出,每次更新用户的位置时,应用程序都会调用observeValue()。所以根据我在observeValue()中的代码,这是有道理的,mapView相机将更新每次用户的位置更新。

我通过移动

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

另一个函数一样viewDidAppear()解决了这个问题。

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

注意:请务必将您的位置变量从observeValue()函数中移出,以便在viewDidAppear()中使用。

使用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,导致为用户的位置图设置相机。