【问题标题】:does Mapkit on IOS support dequeuing of overlays? (like it does annotations)IOS 上的 Mapkit 是否支持叠加层的出列? (就像注释一样)
【发布时间】:2016-05-16 06:24:46
【问题描述】:

IOS 上的 Mapkit 是否支持叠加层的出列? (就像它做注释一样)。如果是这样,实现此目的的代码是什么?

背景:使用注释我相信你可以添加很多,让 MapKit 在需要时通过出列方法实例化视图。但是,如果我在全国有很多覆盖物,那同样的事情呢?我是否需要编写代码来检查我所拥有的叠加层是否可见,然后自己实时实例化/删除它们?

【问题讨论】:

  • 附言。此外,人们是否实际上(如果这是一个问题)将叠加层作为“注释”放在地图上,以解决这个问题?可能不适用于大型叠加层,但作为叠加层的一部分可能在屏幕外....
  • PSS。实际上在全国范围内有大约 8000 个叠加层要放置,所以最终我是预先加载它们,还是我需要自己手动管理它们,以便在任何一个时间点只加载更少的数量?即那些可见的

标签: mkmapview mapkit overlay mkannotation mkoverlay


【解决方案1】:

Map Kit 不支持重用覆盖,就像它支持对注释视图执行此操作一样。造成这种情况的原因之一肯定是这两个对象不相似。叠加层是表示地图上某个区域的模型对象,而注释视图是不时用于在地图上显示注释位置的视图对象。重用视图对象的技术(而不是为每次使用创建单独的对象)是一种优化,在 UIKit 的其他几个地方使用,特别是用于 Table View Cells 和各种集合视图。

视图重用模式是建立一些数据索引(表索引路径、地图坐标),然后让委托提供适当的视图对象,以便在特定索引/位置进入视图时使用。当数据对象离开视线时,视图对象在队列中被回收。

注解类似于叠加层,MapKit 也不为它们提供重用,这是有充分理由的:它们是正在显示的数据!

与注释视图类似的对象是叠加渲染器,它(当然!)为叠加提供渲染。我认为这些不被重用的原因是因为它们不是视图系统对象并且可能更轻量级,所以重用几乎没有好处。我们发现证据表明,在 iOS 7.0 之前,MapView 委托 确实 为叠加层提供了一个视图对象,而这已被渲染器概念所取代。

希望对你有帮助。

这会给你带来什么问题?

【讨论】:

  • 我要在全国范围内放置数百个叠加层。您是否可以加载大量数据,然后将其留给 MapView 以优化需要显示的内容?可能需要从主线程中添加这些,所以我猜应用程序启动时的启动时间对用户来说是不明显的?还有一个问题是如何获取可见覆盖列表,我在这里有一个问题:stackoverflow.com/questions/37433336/…
  • PS 实际上在全国范围内有大约 8000 个叠加层要放置,所以最终我是预先将它们全部加载,还是我需要自己手动管理它们,这样只有更少的数字在任何一个时间点加载?即那些可见的
  • 8000 是一个很大的数字。我对遍布美国的 7200 个覆盖层进行了测试,在 iPhone 5 /iOS 9.3 上看到了明显的迟缓。为了获得良好的性能,需要进行某种平铺。但是,我对此进行了简单的尝试,但并不是特别有希望。看起来添加或删除大量叠加层的操作本身并不是很快。也许您可以重新组织您的数据,以便每个 MKOverlay 代表地图区域内的“叠加”图块。您的叠加渲染器需要聪明地绘制适当的数据项。
  • 要回答您的原始问题,我认为您需要推出自己的解决方案。我注意到有一个名为MKTileOverlay 的类,尽管它有不同的意图(从服务器加载图块),但可以用来确定哪些图块是必要的。
猜你喜欢
  • 2012-06-22
  • 2012-06-09
  • 1970-01-01
  • 2023-03-11
  • 2011-03-26
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多