2011-11-04 53 views
2

微软Outlook曾经有 - 并且可能仍然有 - 在Outlook中发生的所有活动的滚动时间表视图。我想在我的应用程序中重新创建类似的内容。带有数百个数据点的UIScrollView最佳实践

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

我能:

  • 组装的小意见,分别代表了一天,例如列表,并从每个的那些日子里填充的数据项那些规模较小的观点,后来追加的聚合视图作为子查看内容视图。

  • 我可能只是简单的填充每个我想要显示的时间轴上的数据项的子视图的内容视图。

我正在寻找,找出是:

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

谢谢!

回答

4

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

通过UIScrollView有效地显示多个屏幕内容是非常困难的。在某些情况下,我已经为此苦苦挣扎了数周。在较旧的硬件(iPhone 3G /第二代iPod或更旧版本)上这种情况要糟糕得多,但如果出现错误,仍然可以轻松地将现代iOS设备抓取到位。您通常会遇到两个性能问题:

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

你或许可以看出这与缩放非常吻合:你不知道一个屏幕是多少!

  • 我建议你设置好东西和简单的一切作为视图开始,不要担心太多的缩放 - 确保它在最大缩放级别顺利工作。
  • 然后,添加缩放功能(您需要将所有小视图放在一个容器视图中进行缩放),并查看它如何在最早支持的硬件上执行。如果你不允许缩小太远,你可能没有任何改变。
  • 如果在缩小时开始突然出现,请尝试将您的内容细分为小块。您需要尝试一下这些大小,但每个贴图20个以上的子视图可能是一个好的开始。在滚动视图代理中,检测用户何时被充分缩小,并通过将shouldRasterize属性设置为CALayer上的true将光栅强制为光栅化。这应该基本上预先渲染一个贴图的所有子视图到一个贴图中,所以当渲染屏幕时,它将使用该预渲染图像,而不是遍历所有子视图并单独渲染它们。一旦用户再次放大,请确保再次禁用它。还要尽量避免一次性为所有瓷砖设置它,否则会出现断断续续的情况,例如,您可以为每个瓷砖设置单独的随机缩放级别阈值。

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

一些额外提示:

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

我希望能帮助您入门。祝你好运!

+0

哇,这是很棒的信息,正是我在找的东西。非常感谢你写得很好的答案。 – Chris