7

我正在开发一个应用程序,我想在其中显示往返机场的虚构飞机。这可能不是我想在地图上展示的唯一东西。

为此,我使用了来自 LocationReminders 的示例代码(他们拥有的 MKOverlayPathView 子类,ReminderCircleView)并将其连接到我自己的代表飞机的 MKOverlay。此类订阅关于覆盖类的坐标和半径属性的 KVO 通知,并在每次更新时使其路径无效。

叠加层以每秒几帧的速度更新其位置,并且我还更新了它的半径,因此我可以模拟透视图(考虑到它是一个模型对象,但仍然是我找到的最佳解决方案,这不是很聪明)。

我正在使用一个简单的圆形路径进行测试。

此设置工作正常。覆盖视图得到更新并且它的行为正确,随着地图和所有的缩放。

问题在于,在模拟飞行中,覆盖不会绘制在通常靠近目的地的某些图块上。圆圈看起来像是在这些瓷砖后面。

我能够理解这个问题中的一件事:每当我观察到圆圈没有被绘制在某个瓷砖上时,如果我缩小,圆圈就会被正确绘制。然而,放大或平移并不能解决任何问题。

我的理论是,某些图块(或它们的地图矩形)没有被标记为重绘,因此,只有通过缩小我才能强制执行。但我仍然认为这与放大似乎无济于事的事实不一致。

我不知道我是否做错了什么,或者我是否遇到了错误或其他什么。我改用了注释并且它正在工作,但是如果你在没有自己观察缩放比例的情况下缩小,我将失去表示一个变得更小的平面的能力。

我已经在 5.1、6.0 和 6.1 版本中进行了测试,并且行为是相同的。

4

1 回答 1

2

我已经了解导致这种行为的原因。

在我的每次位置更新时,MKOverlay我都在更改boundingMapRect以匹配飞机的位置。实际上 MKMapView 只在开始时询问MKOverlay它(我通过检查对 的调用来了解这一点-(BOOL)intersectsMapRect:(MKMapRect)mapRect)。

作为测试,我更改了boundingMapRect以匹配整个世界 ( boundingMapRect = MKMapRectWorld;) 并且它有效。然后只需围绕我的飞机路径创建一个问题MKMapRect,就是这样。

好吧,Apple 声明如下boundingMapRect

包含叠加层的投影矩形。(必需)(只读)此属性包含完全包含覆盖区域的最小矩形。这个协议的实现者在实现他们的覆盖类时必须设置这个区域。应该使用投影坐标指定矩形,即通过将地球投影到二维表面上获得的坐标。

我会说:

包含叠加层的投影矩形。(必需)(只读)此属性包含完全包含可以在其中呈现叠加层的区域的最小矩形。这个协议的实现者在实现他们的覆盖类时必须设置这个区域。应该使用投影坐标指定矩形,即通过将地球投影到二维表面上获得的坐标。

于 2012-11-26T16:23:17.147 回答