更新MapKit注释字幕和图像

我在网上search了一下,发现了一些关于如何做我想做的事情的想法,但是我仍然想知道你应该怎么做。

这里是上下文:

我正在为iOS 5开发一个应用程序。我使用MapKit来显示地图,并且为它添加​​了大约5000个注释 – 好像很多,但是不用担心,我使用了一个聚类库:)。 为了在用户每次打开地图时加载它们,我在我的appDelegate中创build它们(我创build了一个批注数组,并调用[_mapView addAnnotations:[appDelegate.annotationsToAdd allObjects]];当我打开地图时)。 创buildannotationsToAdd数组大约需要10秒左右的时间,所以我认为这个解决scheme工作的非常好(你必须等待10秒才能被授权打开地图,但是你只需等待一次,在应用程序启动的时候)。 在每个注释中,我都有一个“链接”到一个对象,其中包含一个值的数组(15浮点数)。 现在,当我创build注释时, subtitle方法返回其中的一个值。

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

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

我可能是错的,但基于我的研究,我明白,你必须删除所有的注释,并重新创build所有这些。 你明白这不是我的select。 每次他改变其中一个控件的值时,我都不能让用户等待10秒钟。

我看到一篇关于KVO的文章:这可能是一个有效的解决scheme吗?

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

我真的很感谢你的帮助,我更希望得到一个详细的答案,告诉我在我显然不常见的情况下要遵循的步骤。

提前致谢。

如果我还没有很好地理解你的情况,我感到抱歉,但是我觉得我正在解决类似的问题,所以我会尽力与你分享我的想法。 我会用你的话作为我的回应指南:

“你必须等待那些被授权才能打开地图的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个引脚,而不是每个fx1km,也就是说不是每个引脚的数量都很大)。你可以把你的五千个分成不同的部分,所以引脚的每个部分都要填充相应的MKMapRect区域正在绘制在地图上。 因此,您的地图在任何给定的时间都会按照需求填充针脚/注释,只针对特定区域。 根据你的情况,这可能会带来巨大的加速。

这是一个非常好的演示与MKMapRect瓷砖: https : //github.com/mtigas/iOS-MapLayerDemo – 填充信息只有特定的地图块。 你也可以google像“地图瓷砖256px”,以了解如何绘制地图。

“我知道你必须删除所有的注释,并重新创build它们才能做到这一点。”

为什么重新创build? 您可以访问地图上已经存在的所有注释 – 为什么不只是遍历相关的注释类并更新他们的字幕呢?

就像是:

  • iPad Mapkit – 更改“当前位置”的标题
  • 注释标注标题不会更改

我希望我的观点能够解决你的问题/情况的范围。

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

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

(从MKMapView类参考 )。

MKMapView将为你pipe理它们,所以你的应用程序不会放慢速度。 这种方法可能不会比你所做的慢,然后理论上你可以这样做:

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

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

但是,你不正确的,你必须一次删除它们。 如果你知道一个特定的注释,你可以简单地做:

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

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

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

最后,如果你想修改一个注解,你可以使用KVO来实现(参见这个堆栈溢出问题 ),但是删除和添加注释也是一样的,只要你不注意,用户就不会注意到animation添加。