1

我在网上搜索了一下,发现了一些关于如何做我想做的事情的想法,但我仍然想知道你认为我应该做什么。

这是上下文:

我正在为 iOS 5 开发一个应用程序。我使用 MapKit 显示地图,并添加了大约 5000 个注释 - 是的,这似乎很多,但别担心,我使用集群库 :)。为了每次用户打开地图时都加载它们,我在我的 appDelegate 中创建它们(我创建了一个注释数组,并[_mapView addAnnotations:[appDelegate.annotationsToAdd allObjects]];在我打开地图时调用)。创建数组大约需要 10 秒annotationsToAdd,所以我认为这个解决方案运行良好(您必须等待这 10 秒才能被授权打开地图,但您只需等待一次,在应用程序启动时) . 在每个注释中,我都有一个指向对象的“链接”,该对象包含一个值数组(15 个浮点数)。现在,当我创建注释时,该subtitle方法会返回其中一个值。

在我的地图的 ViewController 中,我有 2 个分段控件。第一个有 3 个段,第二个有 5 个段,这给出了 15 种组合 - 是的,这与我的注释中的对象数组具有相同数量的值:)。

所以你可能已经看到我的问题来了,我想更新我地图上每个注释的副标题(即使是集群中的那些,因为集群根据它持有的图钉给出平均值)。我还想要的是根据注释字幕的值更新 annotationView 的颜色/图像。

我可能错了,但根据我的研究,我知道您必须删除所有注释,然后重新创建它们才能做到这一点。你明白这不是我的选择。我不能让用户每次更改其中一个控件的值时等待 10 秒。

我在 KVO 上看到了一篇文章:这可能是一个可行的解决方案吗?

我不太了解 NSNotification,但我应该使用它们吗?

我非常感谢您的帮助,我将更加感谢详细的回答,向我展示在我显然不常见的情况下要遵循的步骤。

提前致谢。

4

2 回答 2

4

首先,您应该一次添加所有注释,而不是使用聚类库:

配置地图界面时,您应该立即添加所有注释对象。地图视图使用每个注释对象中的坐标数据来确定相应的注释视图何时需要出现在屏幕上。

(来自MKMapView 类参考)。

MKMapView 将为您管理它们,因此您的应用程序不会变慢。这种方法可能不会比你正在做的慢,然后你理论上可以这样做:

[mapView removeAnnotations:mapView.annotations];
//add your annotations here

如果您想删除所有这些,然后将它们全部添加回来。

但是,您必须一次将它们全部删除是不正确的。如果您知道特定的注释,您可以简单地执行以下操作:

[mapView removeAnnotation:someAnnotation];
[mapView addAnnotation:someOtherAnnotation];

如果你在 NSArray 中有替换,你甚至可以:

[mapView removeAnnotations:arrayOfOldAnnotations];
[mapView addAnnotations:arrayOfNewAnnotations];

最后,如果您想修改注释,您可以使用 KVO(请参阅此 Stack Overflow 问题)来完成,但它也很容易删除,然后添加一个,只要您在,用户就不会注意到'不动画添加。

于 2012-10-01T00:05:21.560 回答
2

如果我最终没有很好地了解您的情况,我很抱歉,但我觉得我正在解决类似的问题,所以我会尝试与您分享我的想法。我将用你的话作为我的回应指南:

“你必须等待那 10 秒才能被授权打开地图”

您是否了解以下<MKOverlayView>协议方法(请参阅http://developer.apple.com/library/IOs/#documentation/MapKit/Reference/MKOverlayView_class/Reference/Reference.html):

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
- (BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale

(假设您在整个世界地图上有 5000 个图钉,而不是每 1 公里,即不是这么大的图钉)您可以将您的 5000 个图钉分成多个部分,因此每个图钉部分将由相应的MKMapRect区域填充正在地图上绘制。因此,您的地图会根据需要在任何给定时间仅针对特定区域填充图钉/注释。根据您的情况,这可能会带来巨大的加速。

MKMapRect这是使用瓦片的一个很好的演示: https ://github.com/mtigas/iOS-MapLayerDemo - 仅填充特定地图片段的信息。您也可以google使用“Map tiles 256px”之类的内容来了解​​地图的绘制方式。

“我知道您必须删除所有注释,然后重新创建它们才能做到这一点。”

为什么要重新创作?您确实可以访问地图上已经存在的所有注释 - 为什么不遍历关联的注释类并更新它们的字幕呢?

就像是:

我希望我的观点确实解决了您的问题/情况的范围。

于 2012-09-30T22:50:07.823 回答