在用户位置更新时停止地图更新 - 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()
.
中使用
我的应用程序在用户的位置启动,但是,每次用户移动地图的相机更新到他们的位置。我希望它加载到他们的位置,然后允许他们自由浏览地图,即使他们的位置在移动。类似于 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()
.