具有数百个数据点的UIScrollView最佳实践

时间:2011-11-04 16:06:25

标签: objective-c ios uiview uiscrollview

Microsoft Outlook过去曾经 - 现在可能仍然 - 在Outlook中发生的所有活动的滚动时间线视图。我想在我的应用程序中重新创建类似的东西。

我已经研究过UIScrollView的文档,我知道如何让它按照我想要的方式工作。我的问题更倾向于在内容视图可能很大时以最有效的方式在UIScrollView中呈现数百个项目。

我可以:

  • 例如,汇总一个较小的视图列表,每个视图代表一天,然后使用每个日期的数据项填充这些较小的视图,然后将这些聚合视图作为子视图附加到内容视图中。

  • 我可以简单地使用子视图填充我想要在时间轴上显示的每个数据项的内容视图。

我想知道的是:

  1. 从内存和时间角度来看,提供所有这些数据点的最有效方法是什么?每个都将作为标签或按钮显示在时间线上。
  2. 哪种方法更自然地支持捏合和缩放?
  3. 提前初始化整个内容视图是否更好(并且可能需要花费大量时间),或者最好只是在“视图窗口”附近初始化视图,然后添加详细信息作为用户滚动?
  4. 谢谢!

1 个答案:

答案 0 :(得分:4)

你肯定知道的唯一方法是尝试一下。我意识到这不是一个过于有用的答案,但我至少可以给你一些提示:

使用UIScrollView s有效地显示多个屏幕的内容是非常困难的。在某些情况下,我已经挣扎了几个星期。在较旧的硬件(iPhone 3G /第二代iPod或更旧版本)上情况更糟,但如果你弄错了,你仍然可以轻松地将现代iOS设备带到爬行中。您通常会遇到两个性能问题:

  • 屏幕上有许多UIView(包括UILabel等),会严重损害性能。如果每个数据点都是一个视图,你就会遇到这种情况,你可以缩小以查看所有数据点。
  • 相反,拥有巨大的视图(大于一个屏幕)同样糟糕,因为整个视图需要保存在内存中,而任何一个都可见。

你可能会看到这与缩放有什么关系:你不确切知道一个屏幕是多少!

  • 我建议你把事情设置得很漂亮,一切都像视图一样开始,不要过于担心缩放 - 确保它在最大缩放级别都能顺利运行。
  • 然后,添加缩放(您需要将所有小视图放在一个容器视图中,该视图将被缩放)并查看它在您最早支持的硬件上的表现。如果你不允许缩小太远,你可以没有任何改变。
  • 如果在缩小时开始加速,请尝试将内容细分为切片。您需要尝试这些尺寸,但每个瓷砖20多个子视图可能是一个好的开始。在滚动视图委托中,检测用户何时缩小,并通过在shouldRasterize上将CALayer属性设置为true来强制您的切片进行栅格化。这应该基本上将瓷砖的所有子视图预呈现为纹理,因此在渲染屏幕时,它将使用预渲染的图像,而不是遍历所有子视图并单独渲染它们。一旦用户再次放大,请务必再次禁用它。还要尽量避免一次为所有瓷砖设置它或者它会断断续续,所以例如你可以为每个瓷砖设置单独的随机缩放级别阈值。

如果您最终遇到shouldRasterize问题,则可能需要直接在CALayer级别工作。如果这些都没有帮助,那么大锤方法就像CATiledLayer一样使用MKMapView而其他方法也是如此。这需要您自己完成所有渲染和触摸事件处理,并且通常还会导致在地图和Safari应用程序中滚动时获得的(有点难看)淡入。

一些额外的提示:

  • 避免在内存中保留大量不同的图像。这意味着如果可以的话,重新使用少量UIImage s。如果每个视图略有不同,请在drawRect中按需生成图像:或使用过滤器,而不是将它们预先绘制为CGImage,或者从文件中加载它们。
  • 尽可能避免alpha混合(半透明)。
  • 您可以使用Performance Tool可视化UIKit合成复杂性。查看WWDC档案中的核心动画和工具讲座。

我希望这有助于您入门。祝你好运!