在用户位置更新时停止地图更新-谷歌地图iOS SDK
我的应用程序在用户的位置启动,但是,每次用户将地图的相机更新移动到他们的位置时。我希望它加载到他们的位置,但允许他们自由浏览地图,即使他们的位置正在移动。类似于谷歌地图应用程序中显示的行为。我正在使用KVO收集在用户位置更新时停止地图更新-谷歌地图iOS SDK,ios,swift,google-maps,key-value-observing,Ios,Swift,Google Maps,Key Value Observing,我的应用程序在用户的位置启动,但是,每次用户将地图的相机更新移动到他们的位置时。我希望它加载到他们的位置,但允许他们自由浏览地图,即使他们的位置正在移动。类似于谷歌地图应用程序中显示的行为。我正在使用KVO收集viewDidLoad()函数中的位置。这条线是这样的: mapView.isMyLocationEnabled = true self.mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObser
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)
}
需要进行哪些更改以使其满足上述标准。使用帮助程序代码,您可以获取用户的位置并设置目标,如:
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)
}];
如果您不想使用上面的帮助代码,那么您也可以获取用户的位置
请注意,每次更改用户的位置时,您的代码都会调用observeValue
,这会导致为用户的位置地图设置摄像头。在Sunil上述答案的帮助下,我找到了解决此问题的方法
Sunil注意到,每次更新用户的位置时,应用程序都会调用observeValue()
。因此,根据我在observeValue()
中的代码,mapView
相机将在每次用户位置更新时更新
我搬家解决了这个问题
self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14)
到另一个函数,如viewdide()
有些人可能会问,为什么我没有将它移动到viewDidLoad()
之前调用的viewdidappease()
。在viewDidLoad()
结束之前,应用程序不会获取用户的位置。因此,将摄像头声明放在viewDidLoad()
末尾并没有给应用程序足够的时间获取用户位置。通过在viewdideappear()
函数中声明相机位置,我们为应用程序提供了充足的时间来处理用户的位置并获取它
注意:确保将您的位置变量从observeValue()
函数中传递出去,以便在viewdideappease()
中使用。获取myLocation
的值后,您可以删除observer。因此,它将在地图上定位您的位置一次,然后不会再次更改相机,例如:self.mapView.removeObserver(self)
,在observeValue()
方法的底部。@SunilChauhan这给了我以下错误:由于未捕获的异常“NSInternalInconsistencyException”终止应用程序,原因:“GMSMapView类的实例0x101f30160已解除分配,而键值观察员仍在该实例中注册。当前观测信息:()'