【问题标题】:UIScrollView Best Practices with hundreds of data points具有数百个数据点的 UIScrollView 最佳实践
【发布时间】:2011-11-05 04:40:20
【问题描述】:

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

我研究了 UIScrollView 的文档,并且知道如何让它按我想要的方式工作。当内容视图可能很大时,我的问题更适合在 UIScrollView 中呈现数百个项目的最有效方式。

我可以:

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

  • 我可以简单地用子视图填充一个内容视图,其中包含我想在时间轴上显示的每个数据项。

我想知道的是:

  1. 从内存和时间的角度来看,呈现所有这些数据点的最有效方式是什么?每个都将作为标签或按钮出现在时间轴上。
  2. 哪种方法更自然地支持捏合和缩放?
  3. 是提前初始化整个内容视图更好(可能会花费大量时间),还是只在“视图窗口”附近初始化视图,然后添加细节作为用户滚动?

谢谢!

【问题讨论】:

    标签: objective-c ios uiview uiscrollview


    【解决方案1】:

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

    众所周知,使用UIScrollViews 有效地显示一屏以上的内容非常困难。在某些情况下,我已经为此苦苦挣扎了好几个星期。这在旧硬件(iPhone 3G/第二代 iPod 或更早版本)上要糟糕得多,但如果你弄错了,你仍然可以轻松地让现代 iOS 设备爬行。您通常会遇到两个性能问题:

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

    您可能会看到这与缩放非常不匹配:您不知道一屏到底有多少!

    • 我建议您将所有内容都设置为简单易用的视图,并且不要太担心缩放 - 确保在最大缩放级别下一切顺利。
    • 然后,添加缩放功能(您需要将所有小视图放在一个将被缩放的容器视图中)并查看它在您支持的最旧硬件上的性能。如果您不允许缩小太多,则无需任何更改即可。
    • 如果在您缩小时它开始抖动,请尝试将您的内容细分为图块。您需要尝试这些大小,但每个图块 20 多个子视图可能是一个好的开始。在您的滚动视图委托中,检测用户何时被充分缩小,并通过将其CALayer 上的shouldRasterize 属性设置为true 来强制您的图块栅格化。这实际上应该将图块的所有子视图预渲染到纹理中,因此在渲染屏幕时,它将使用该预渲染图像,而不是遍历所有子视图并单独渲染它们。一旦用户再次充分放大,请确保再次禁用它。还要尽量避免一次为所有图块设置它,否则它会卡顿,例如,您可以为每个图块设置单独的随机缩放级别阈值。

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

    一些额外的提示:

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

    我希望这可以帮助您入门。祝你好运!

    【讨论】:

    • 哇,这信息太棒了,正是我想要的。非常感谢您写得很好的答案。
    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2014-01-05
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多