Objective c UIScrollView具有数百个数据点的最佳实践
Microsoft Outlook过去有一个滚动时间线视图,可以查看Outlook中发生的所有活动,现在可能仍然有。我想在我的应用程序中重新创建类似的东西 我已经研究了UIScrollView的文档,我知道如何让它以我想要的方式工作。我的问题更倾向于当内容视图可能很大时,以最有效的方式在UIScrollView中显示数百项 我可以:Objective c UIScrollView具有数百个数据点的最佳实践,objective-c,ios,uiview,uiscrollview,Objective C,Ios,Uiview,Uiscrollview,Microsoft Outlook过去有一个滚动时间线视图,可以查看Outlook中发生的所有活动,现在可能仍然有。我想在我的应用程序中重新创建类似的东西 我已经研究了UIScrollView的文档,我知道如何让它以我想要的方式工作。我的问题更倾向于当内容视图可能很大时,以最有效的方式在UIScrollView中显示数百项 我可以: 例如,组合一个较小视图的列表,每个视图表示一天,并使用这些天中的数据项填充这些较小视图,然后将这些聚合视图作为子视图附加到内容视图中 或 我可以简单地用子视图
- 例如,组合一个较小视图的列表,每个视图表示一天,并使用这些天中的数据项填充这些较小视图,然后将这些聚合视图作为子视图附加到内容视图中
- 我可以简单地用子视图填充一个内容视图,其中包含我想在时间线上显示的每个数据项
谢谢 你能确定的唯一方法就是做一点实验。我意识到这不是一个非常有用的答案,但我至少可以给你一些提示: 使用
UIScrollView
s高效地显示多屏内容是出了名的困难。在某些情况下,我已经为此挣扎了好几个星期。在较旧的硬件(iphone3g/2ndgen iPod或更旧的)上情况更糟,但如果你弄错了,你仍然可以轻松地将现代iOS设备拖下水。您通常会遇到两个性能问题:
- 同时在屏幕上显示多个
s(包括UILabel等)会严重影响性能。如果每个数据点都是一个视图,并且可以缩小以查看所有数据点,则会遇到这种情况UIView
- 相反,拥有巨大的视图(大于一个屏幕)同样糟糕,因为当任何视图都可见时,整个视图都需要保存在内存中
- 我建议你把一切都设置得很好很简单,从视图开始,不要太担心缩放-确保在最大缩放级别上一切都顺利李>
- 然后,添加缩放功能(您需要将所有小视图放在一个容器视图中,该容器视图将被缩放),并查看它在最早支持的硬件上的性能。如果你不允许放大太远,你可能不会有任何改变
- 如果缩小时它开始发出嘎嘎声,请尝试将内容细分为平铺。您需要尝试这些的大小,但是每个平铺20多个子视图可能是一个好的开始。在滚动视图代理中,通过在用户的
上将CALayer
属性设置为true,检测用户何时充分缩小并强制平铺光栅化。这实际上应该将平铺的所有子视图预渲染为纹理,因此在渲染屏幕时,它将使用预渲染图像,而不是遍历所有子视图并单独渲染它们。确保用户再次充分放大后再次禁用它。此外,还应避免一次为所有平铺设置它,否则它将结巴,例如,您可以为每个平铺设置单独的随机缩放级别阈值shouldRasterize
应光栅化
方面遇到问题,您可能需要直接在CALayer
级别工作。如果这些都没有帮助,大锤方法是使用CATiledLayer
,就像MKMapView
和其他方法一样。这需要您自己处理所有渲染和触摸事件,并且通常还会导致在地图和Safari应用程序中滚动时出现(有点难看)淡入
其他一些提示:
- 避免在内存中保存大量不同的图像。这意味着如果可以,可以重新使用少量的
s。如果每个视图稍有不同,请在drawRect:中按需生成图像,或使用过滤器,而不是将图像预先绘制为UIImage
s,或从文件中加载它们CGImage
- 尽可能避免alpha混合(半透明)
- 您可以使用性能工具可视化UIKit合成的复杂性。查看WWDC档案中的核心动画和工具对话
我希望这能帮助你开始。祝你好运 哇,这是很棒的信息,正是我想要的。非常感谢你的书面答覆。