Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在用户位置更新时停止地图更新-谷歌地图iOS SDK_Ios_Swift_Google Maps_Key Value Observing - Fatal编程技术网

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

在用户位置更新时停止地图更新-谷歌地图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

我的应用程序在用户的位置启动,但是,每次用户将地图的相机更新移动到他们的位置时。我希望它加载到他们的位置,但允许他们自由浏览地图,即使他们的位置正在移动。类似于谷歌地图应用程序中显示的行为。我正在使用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)

}
需要进行哪些更改以使其满足上述标准。

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

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已解除分配,而键值观察员仍在该实例中注册。当前观测信息:()'