第二个例子
当你在一台老式设备上运行一个含有 TableView 的应用,而每个 Cell 上又
由很多的子视图(subView)组成的时候,对 Cell 的绘制代码进行定制化将有助于性能的提升。对于 iPhone4 及其以前的设备,这个性能优化技巧做带来的效果是显著的。
每一个 Cell 都由一个用户头像图片,一个用户名,还有一个附带图片、标题和内容的状态构成。测试结果如表 3-5 所示。
表 3-6 显示了对 Cell 的绘制代码进行定制化之后的测试结果
从表 3-5 和表 3-6 的数据对比可以看出,个性化的渲染代码对渲染时间有了一个显著地提升。对一个有着复杂子视图结构的应用而言,这种性能已经足够好到不用再进行什么优化了。
图 3-6 中的 TableViewCell 有四个图片,外加一个不同背景颜色的子视图。当你想在已有视图中简单快速的创建一个拥有不同背景颜色的视图组件的时候,子视
图通常是个不错的选择。但是这种方法在滚动视图的时候可能会导致一些性能问题,因此你需要想办法避免这种解决方案。
if (cell == nil) {
cell = [[CustomDrawingTableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];}
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
CGRect subFrame = CGRectMake(0.0, 0.0,
self.contentView.bounds.size.width, self.contentView.bounds.size.height);
drawingView = [[CustomDrawingView alloc] initWithFrame: subFrame];
drawingView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;
接下来是最重要的部分:如何在视图内绘制文本,图像和控件。
CustomDrawingView.m
- (void)drawRect:(CGRect)rect {
lineBreakMode:UILineBreakModeTailTruncation alignment:UIBaselineAdjustmentAlignBaselines];
// Drawing Image
[self.avatarImage drawInRect:CGRectMake(20, 5, 36, 34)];
[self.button drawInRect:CGRectMake(50, 5, 36, 34)];}
发现维护程序变得非常困难。因此,谨慎使用 drawRect 方法,并且避免过度优化。]
其他的相关技术
就对 TableView 的滚动性能就行优化这个话题,我们已经讨论了一些重要的
技术。还有一些你不经常用到的小技巧,但是我也会这在里介绍一下它们。如果你能理解这些概念,你就在其他的例子能使用这些技术。
缓存高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
通过 InterfaceBuilder 可以简单的进行这种设置。开发者应当多检查检查相关设置,以确保所有的子视图都是不透明的,图 3-7 显示了如果将 Cell 的子视图设置为不透明。
对相应的代码来说,我们也可以通过代码来进行相关的设置,设置方法如下:
尽量在 UIImage 中避免使用类似渐变效果这种特效。在对 CoreAnimation 进行相关的设置后,对你的应用检查特效和相关的问题,如图 3-8 和 3-9 所示。
在前面的一些章节中,我为你展示了如何直接进行绘制,通过这种方法,你可以对你的应用性能进行大幅度的优化。然后,这种绘制的方法在动画以及重排的性能方面会造成一些问题。
(2)适当地复用 Cell。这是相关性能优化的第一步,也是最重要的移步。这很容易实现,但是很多应用并没有这么做。因此,如果你有相关的性能问题,请多检查一下相关的部分是否已经做了这种优化。
(3)正确地缓存、复用图像和数据。另外一个重要的优化步骤就是,在返回或者显示一个 Cell 的时候,减少加载数据和图像的时间。
(4)减少逻辑计算时间。并不是只有 I/O 过程才会减慢或者阻塞 UI 线程;任何一种数据处理都有可能会有这种效果。因此,你需要尽量减少这一类数据处理。
(5)设置为不透明。这个小问题通常发生在开发者在视图中添加元素的时候。如果他们没有把每个视图都设置为非透明状态的话,那么渲染的时候就要对同一个点进行多次渲染。
(6)对高度进行缓存。这是开发者通常犯的另外一个小错误。每当需要一个新的 Cell 的时候,有两个主要方法要被调用。
(7)避免使用图形特效。在 Cell 上,有越多的图形特效,那么渲染的过程就会越缓慢。所以,你也应该对这点进行相关的测试。你应该使用 CoreAnimation来检查每个 UI 组件的渲染情况。
1.创建一个检查清单,以保证你在执行必要的,基本的优化步骤的时候,能让UITableViewCell 的相关性能变得更好。
B.实践
1.写一个小应用,来查看在有编辑操作和动画的时候,drawRect 是如何运行的。
2.实践在"复用图像"这一小节提到的练习。尝试着使用多线程技术来从文件中加载图像。