【问题标题】:Update MapKit annotation subtitle and image更新 MapKit 标注字幕和图片
【发布时间】:2012-09-24 08:29:22
【问题描述】:

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

这里是上下文:

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

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

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

我可能错了,但根据我的研究,我了解您必须删除所有注释,然后重新创建它们以执行此操作。您了解在我的情况下,这不是一个选项。我不能让用户每次更改其中一个控件的值时都等待 10 秒。

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

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

非常感谢您的帮助,我更希望得到详细的回答,向我展示在我显然不常见的情况下应遵循的步骤。

提前致谢。

【问题讨论】:

  • 能把数据容器的代码和要更新字幕的代码贴出来吗?它可能会帮助 SO 社区通过上下文来制定答案。例如是否有必要一次更改每个注释?或者当它们出现并且你能够阅读注释时,你能忍受改变它们吗? (当然,即使在 iPad 的 Retina 显示屏上,也没有人能够一次读取全部 5000 条注释,是吗?)您可能想借鉴 Apple 在 iOS 中为 TableView 使用的理论,他们只为表格请求数据查看可见的单元格。

标签: ios annotations mapkit updates subtitle


【解决方案1】:

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

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

(来自MKMapView Class Reference)。

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

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

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

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

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

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

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

最后,如果你想修改一个注解,你可以使用 KVO(见this Stack Overflow question),但它也很容易删除,然后添加一个,只要用户不会注意到您没有为添加设置动画。

【讨论】:

  • 嗨。我确实一次添加了所有注释,聚类库只是重新组合显示的注释视图。我并不是说我不能删除/添加单个注释,我的意思是当所有我的注释立即更改时,我认为我有 i> 删除所有视图并将它们添加回来。无论如何,我会考虑使用 KVO(正如我在 Stanislaw 的回答中的评论中所说,当时我不知道我能做到这一点),但是 Stanislaw 建议的迭代注释的解决方案可能更适合我的情况。感谢您的回答。
【解决方案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”来了解地图是如何绘制的。

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

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

类似:

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

【讨论】:

  • 无需弄清楚注释何时出现 - 只需一次添加它们,如文档中所述:developer.apple.com/library/ios/#Documentation/MapKit/Reference/…
  • 嗨。感谢您的回答。不幸的是,这 5000 个图钉不在整个世界地图上,而是仅在 2 个城市本地化......自从我问了我的问题后,我看到我可能可以使用 KVO(正如 Aaron 在他的回答中所建议的那样)来更新我的注释视图。我会调查的。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多