我希望地图始终以用户位置为中心,但我希望它始终处于精确的缩放级别。我从这个answer获得的是,我无法在不缩放用户位置的情况下使用userTrackingMode
。
所以我创建了一个解决方法来关注用户的位置
func updateRegion(withUserLocation userLocation: CLLocationCoordinate2D) {
var region = MKCoordinateRegion.init(center: userLocation, span: MapBodyViewConstants.zoomLevel)
// Avoid random spanning on the map by setting the region's span to be the same with the map's span
region.span = mapView.region.span
mapView.setRegion(region, animated: true)
}
问题在于,我从CLLocationManager
函数didUpdateLocations
获取了位置,locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
manager.location?.coordinate
与locations.last?.coordinate
不同。这是一个很小的差异,但仍然存在差异(我应该提一下,我只能通过关闭wifi获得这种差异)。
为什么会有差异,我应该使用哪一个?经过一些研究,我得到locations.last.coordinate
是首选的,但我不确定(而且我认为蓝色用户点使用经理的位置,但也不确定这个位置)
还有一个问题:iOS使用什么来获取地图用户的蓝点位置?是locationManager坐标还是什么?
我希望这些问题足够清楚......
编辑:我想我也应该提一下。问题不在MKMapViewDelegate
方法mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)
中。这很好。但是在我启动应用程序时,我会使用CLLocationManager
中的位置以及问题所在的位置
答案 0 :(得分:1)
由于各自的更新方式,您看到的差异是正常的。您应该始终检查您的位置对象的时间戳,以确保它是最新的。此外,这是来自Apple Docs关于manager.location
:
在iOS 4.0及更高版本中,此属性可能在启动时包含更新的位置对象。具体来说,如果正在运行重要的位置更新并且您的应用程序已终止,则在重新启动应用程序时(您创建新的位置管理器对象),将使用最新的位置数据更新此属性。此位置数据可能比您的应用处理的最后一个位置事件更新。 检查存储在此属性中的位置的时间戳始终是一个好主意。如果接收器当前正在收集位置数据,但最小距离过滤器很大,则返回的位置可能相对较旧。如果是,您可以停止接收器并再次启动以强制更新。