iOS - 映射用户位置不居中

时间:2017-03-21 13:45:22

标签: ios swift mapkit cllocationmanager

我希望地图始终以用户位置为中心,但我希望它始终处于精确的缩放级别。我从这个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?.coordinatelocations.last?.coordinate不同。这是一个很小的差异,但仍然存在差异(我应该提一下,我只能通过关闭wifi获得这种差异)。

为什么会有差异,我应该使用哪一个?经过一些研究,我得到locations.last.coordinate是首选的,但我不确定(而且我认为蓝色用户点使用经理的位置,但也不确定这个位置)

还有一个问题:iOS使用什么来获取地图用户的蓝点位置?是locationManager坐标还是什么?

我希望这些问题足够清楚......

编辑:我想我也应该提一下。问题不在MKMapViewDelegate方法mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)中。这很好。但是在我启动应用程序时,我会使用CLLocationManager中的位置以及问题所在的位置

1 个答案:

答案 0 :(得分:1)

由于各自的更新方式,您看到的差异是正常的。您应该始终检查您的位置对象的时间戳,以确保它是最新的。此外,这是来自Apple Docs关于manager.location

  

在iOS 4.0及更高版本中,此属性可能在启动时包含更新的位置对象。具体来说,如果正在运行重要的位置更新并且您的应用程序已终止,则在重新启动应用程序时(您创建新的位置管理器对象),将使用最新的位置数据更新此属性。此位置数据可能比您的应用处理的最后一个位置事件更新。   检查存储在此属性中的位置的时间戳始终是一个好主意。如果接收器当前正在收集位置数据,但最小距离过滤器很大,则返回的位置可能相对较旧。如果是,您可以停止接收器并再次启动以强制更新。