然而,每当用户将地图的相机更新移动到其位置时,我的应用就会在用户的位置启动。我希望它加载到他们的位置,但随后允许他们自由浏览地图,即使他们的位置正在移动。与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)
}
需要更改以使其符合上述标准。
答案 0 :(得分:1)
使用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
,从而导致为用户的位置图设置相机。
答案 1 :(得分:0)
在Sunil上面的回答的帮助下,我想出了如何解决这个问题。
Sunil指出,每次更新用户的位置时,应用都会调用observeValue()
。因此,基于我在observeValue()
中的代码,这将有意义mapView
相机每次用户的位置更新时都会更新。
我通过移动来解决问题
self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 14)
到另一个函数,如viewDidAppear()
。
有些人可能会问为什么我没有将其移至viewDidLoad()
,因为在viewDidAppear()
之前调用了viewDidLoad()
。应用程序在viewDidLoad()
结束前不会获取用户的位置。因此,将相机声明放在viewDidAppear()
的末尾并不会给应用程序足够的时间来获取用户位置。通过在observeValue()
函数中声明相机位置,我们为应用程序提供了足够的时间来处理用户的位置并获取它。
注意:请确保将您的位置变量从viewDidAppear()
函数中传出,以便在Intent foo = new Intent(this, viewContacts.class);
中使用。