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