停止地图更新用户位置更新 - 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)
}
什么需要改变,以使其符合上述标准。
在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
,导致为用户的位置图设置相机。
一旦获取了myLocation的值,就可以删除观察者。因此,它会在地图上定位您的位置,然后不会再像以下那样更换摄像机:'observeValue()'方法底部的'self.mapView.removeObserver(self)'。 –
@SunilChauhan这给了我以下错误:**终止应用程序,由于未捕获的异常'NSInternalInconsistencyException',原因:'类GMSMapView的实例0x101f30160被释放,而键值观察员仍然注册它。当前观察信息:( Context:0x0,Property:0x174054940> ) * –