你肯定知道的唯一方法就是试验一下。我意识到这不是一个非常有用的答案,但我至少可以给你一些提示:
通过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和工具讲座。
我希望能帮助您入门。祝你好运!
哇,这是很棒的信息,正是我在找的东西。非常感谢你写得很好的答案。 – Chris