我正在使用以下代码:
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
在应用程序或全新启动的情况下,经过漫长的简历后发生了什么......
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
这是预期的行为:iPhone并不总是使用GPS跟踪用户位置(这样会消耗太多电池)。因此,一旦显示地图,MKMapView
实例就会显示它所知道的最后一个“最佳”用户位置,然后通过激活跟踪来提高精度(这是一个无缝的过程,您不必担心)。
您可以通过实现MKMapViewDelegate
协议来监控MKMapView
何时在地图上更新用户位置,只需实现:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy;
if (accuracy ......) {
}
}
(更多信息请参阅苹果文档此处)
我例子中的代码检查了mapView当前显示位置的准确性并相应地做出反应。
[编辑]
如果一开始在海中心显示用户位置真的让您感到困扰,您可以隐藏用户位置,直到获得足够精确/新鲜的位置。
为此,在收到足够准确的位置(通过前一个代理回调)之前,将MKMapView
的showsUserLocation
属性设置为NO
,然后将其设置为YES
。
这样做可以避免显示不准确或太旧的位置(在CLLocation
中有一个timestamp
属性可用于检查它是否是旧位置)
注意:您无需在您的代码中创建CLLocationManager
实例,MKMapView会在内部创建一个并通过此代理选择器发布接收到的位置。
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
当userLocation
或location
为nil
时访问坐标。如果userLocation
或location
为nil
,这将返回0个坐标。纬度为0,经度为0的位置位于非洲海岸外的大西洋上。在从中获取坐标之前,您可以添加一个检查location
以确保它不是nil
的操作:
if (self.mapView.userLocation.location) {
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
}
mapView:didUpdateUserLocation:
,以了解何时有有效位置可用。您对 didUpdateUserLocation:
的实现应丢弃任何水平精度 horizontalAccuracy < 0 的位置,这表示无效位置。-(void)mapView:(MKMapView*)mapView didUpdateUserLocation:(MKUserLocation*)userLocation
{
if (userLocation.location.horizontalAccuracy > 0) {
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
}
}
这很遗憾是GPS芯片的功能。它并不总是开启,因此数据通常在最初的几个时刻会出现错误。您最好的选择可能是将应用程序记录的最后位置存储在NSUserDefaults中,然后等待精度达到所需水平后再切换到实时数据,或者在精度达到所需水平之前隐藏MkMapView,然后在该点显示它(您可以在过渡期间显示加载屏幕)。
我在这里做的是-
如果你需要非常精确的位置,那么还要检查准确性,并设置一个超过该时间无法容忍等待的超时,并使用不太准确的修复。
正如Jeremy Massel所写,您必须在应用程序启动/继续时解决第一个错误位置。几个月前我发现了一篇很棒的博客文章:
http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/
它距离您的实际位置有多远?当应用程序刚开始或从长时间暂停后恢复时,用户位置通常总是错误的。随着应用程序的运行,它将变得越来越准确。在CLLocationManager中有获取用户位置精度的方法,请查看那里获得什么样的值。