为了澄清这个问题的目的:我知道如何使用子视图和使用 drawRect 创建复杂的视图。我试图完全理解何时以及为什么要使用其中一个。
我也明白提前优化那么多是没有意义的,并且在进行任何分析之前做一些更困难的事情。考虑到我对这两种方法都很满意,现在真的想要更深入的了解。
我的很多困惑来自于学习如何使表格视图滚动性能真正流畅和快速。当然,这个方法的原始来源是来自twitter for iPhone(以前的 tweetie)背后的作者。基本上它说要使表格滚动流畅,秘诀是不使用子视图,而是在一个自定义 uiview 中完成所有绘图。从本质上讲,使用大量子视图似乎会减慢渲染速度,因为它们有很多开销,并且不断地在它们的父视图上重新合成。
公平地说,这是在 3GS 还很新的时候写的,从那时起 iDevices 变得更快了。仍然在互联网和其他地方经常建议这种方法用于高性能表。事实上,这是Apple 的 Table Sample Code中建议的方法,已在多个 WWDC 视频(iOS 开发者实用绘图)和许多 iOS编程书籍中提出。
甚至还有一些很棒的工具来设计图形并为它们生成核心图形代码。
所以起初我被引导相信“Core Graphics 的存在是有原因的。它很快!”
但是,一旦我想到“尽可能使用核心图形”的想法,我就开始看到 drawRect 通常是导致应用程序响应能力差的原因,在内存方面非常昂贵,并且确实对 CPU 造成了负担。基本上,我应该“避免覆盖 drawRect ”(WWDC 2012 iOS App Performance: Graphics and Animations)
所以我想,就像所有事情一样,它很复杂。也许您可以帮助自己和其他人了解使用 drawRect 的时间和原因?
我看到一些使用 Core Graphics 的明显情况:
- 您有动态数据(Apple 的股票图表示例)
- 你有一个灵活的 UI 元素,不能用简单的可调整大小的图像来执行
- 您正在创建一个动态图形,该图形一旦渲染就会在多个地方使用
我看到了避免使用核心图形的情况:
- 您的视图的属性需要单独设置动画
- 您的视图层次结构相对较小,因此任何使用 CG 的额外努力都不值得
- 您想更新视图的各个部分而不重绘整个视图
- 当父视图大小发生变化时,您的子视图的布局需要更新
所以赐予你的知识。在什么情况下你会使用 drawRect/Core Graphics(也可以通过子视图来实现)?是什么因素导致你做出这个决定?如何/为什么建议在一个自定义视图中绘制黄油般平滑的表格单元格滚动,但出于性能原因,Apple 建议不要使用 drawRect?那么简单的背景图片呢(你什么时候用 CG 创建它们而不是使用可调整大小的 png 图片)?
制作有价值的应用程序可能不需要对这个主题有深入的了解,但我不喜欢在无法解释原因的技术之间进行选择。我的大脑生我的气。
问题更新
谢谢大家的信息。这里有一些澄清问题:
- 如果您正在使用核心图形绘制一些东西,但可以使用 UIImageViews 和预渲染的 png 完成同样的事情,您是否应该一直走这条路?
- 一个类似的问题:尤其是像这样的坏蛋工具,你什么时候应该考虑在核心图形中绘制界面元素?(可能当您的元素的显示是可变的。例如,具有 20 种不同颜色变化的按钮。还有其他情况吗?)
- 鉴于我在下面的回答中的理解,是否可以通过在复杂的 UIView 渲染本身之后有效地捕获单元格的快照位图并在滚动和隐藏复杂视图时显示它来获得表格单元格的相同性能提升?显然,有些部分必须解决。只是我的一个有趣的想法。