为啥 MKMapView 用户 Location 属性是垃圾......一段时间?

Posted

技术标签:

【中文标题】为啥 MKMapView 用户 Location 属性是垃圾......一段时间?【英文标题】:Why is the MKMapView's userLocation property rubbish ... for a while?为什么 MKMapView 用户 Location 属性是垃圾......一段时间? 【发布时间】:2011-06-04 03:22:37 【问题描述】:

我在 IB 中定义了一个地图视图,它被设置为显示用户位置。

在我的应用程序中,在 -viewDidAppear 中,我查询 self.mapView.userLocation.location.coordinate 并返回疯狂的值,例如:

纬度:4.8194501961644877e-49经度:2.2993313035571993e-59

但是,下次调用 -viewDidAppear 时(在我简单地移动到另一个选项卡式视图然后返回到这个视图之后),userLocation 属性恰好包含我当前位置的正确值。

似乎在我初次调用时,userLocation 属性尚未初始化,但尽管阅读了 Apple 的文档,但我看不到任何说明该属性仅有效的警告做完xxx之后。

userLocation 有效使用之前是否必须发生一些事情,或者我应该只使用 CLLocationManager 并询问它吗?

提前感谢您的帮助。

遗憾的是,Thomas 的建议没有帮助。我后来发现的是:

如果 showsUserLocation 为 NO,则永远不会正确设置 userLocation 并且永远不会调用 -MapView:didUpdateUserLocation:,因此我永远不会得到一个合理的位置值。

所以,要获取用户的位置,我必须将 showsUserLocation 设置为 YES,但这意味着在我的所有注释都添加到视图之后(不包括用户的位置),然后我会计算包含它们并以正确的缩放级别全部显示它们所需的跨度。不过,在我这样做之后,视图会随着地图视图横向跳跃,然后自动将用户的位置显示为蓝色斑点!由于它从未包含在注释中以计算缩放级别,因此我无法将其合并到我的计算中。啊!

请注意,当 showsUserLocation 为 YES 时,会调用 -MapView:didUpdateUserLocation:,但仅在我计算出所有注释的坐标之后,而不是之前!

【问题讨论】:

请注意,当 showsUserLocation 为 YES 时,-MapView:didUpdateUserLocation: 会被调用,但仅在我计算完所有注释的坐标之后,而不是之前! 那么,为什么不在第一次调用时计算注释的坐标?!大声笑...用这种方法计算它。 :p 嗨,Thomas - 确实!昨晚我再次查看代码并将 NSLog 语句放在周围,这也是我得出的结论!我会尽快回来报告的。再次感谢 【参考方案1】:

我假设它还没有找到用户位置 - 它必须解决这个问题并且可能需要一段时间。

不要在viewDidLoad 中使用它,而是使用这个委托方法:

- (void)mapView:(MKMapView *)myMapView didUpdateUserLocation:(MKUserLocation *)userLocation;

您需要将 mapview 委托设置为 self。 :)

【讨论】:

谢谢你,Thomas,我会试试你的建议。 抱歉,Thomas 没用 - 请查看我在上面添加的额外发现。 mapView:didUpdateUserLocation: 方法中计算和更新您的地图区域——这样您就可以包含所有注释和用户的位置。另外,请注意,当手机更新其 GPS 坐标时,将继续调用该委托方法。 是的,我发现即使我的 iPod 固定在我的桌子上,它也会被反复调用!【参考方案2】:

Core Location 通常也是如此。你会得到最后一个位置在它的缓冲区中徘徊,有时,或者是一个超宽的投掷飞镖的地图类型的位置......

最好的办法是检查位置对象的.horizontalAccuracy 属性,并丢弃任何过于模糊的属性。把第一个也扔掉是个好习惯。

【讨论】:

【参考方案3】:

要调用 didUpdateUserLocation,您必须... mapView.showsUserLocation = TRUE;

【讨论】:

以上是关于为啥 MKMapView 用户 Location 属性是垃圾......一段时间?的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 获取中心坐标在南半球添加抖动

为啥 MKMapView 不显示当前位置红色图钉?

iOS - MKMapView - 可拖动注释

MKMapView 不更新用户位置图像

MKMapView:用户位置图钉颜色自动变为灰色

iOS 8 MKMapView 用户位置请求失败