图通常是个不错的选择。但是这种方法在滚动视图的时候可能会导致一些性能问题,因此你需要想办法避免这种解决方案。
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 的子视图设置为不透明。
(2)适当地复用 Cell。这是相关性能优化的第一步,也是最重要的移步。这很容易实现,但是很多应用并没有这么做。因此,如果你有相关的性能问题,请多检查一下相关的部分是否已经做了这种优化。
(3)正确地缓存、复用图像和数据。另外一个重要的优化步骤就是,在返回或者显示一个 Cell 的时候,减少加载数据和图像的时间。
(4)减少逻辑计算时间。并不是只有 I/O 过程才会减慢或者阻塞 UI 线程;任何一种数据处理都有可能会有这种效果。因此,你需要尽量减少这一类数据处理。
(5)设置为不透明。这个小问题通常发生在开发者在视图中添加元素的时候。如果他们没有把每个视图都设置为非透明状态的话,那么渲染的时候就要对同一个点进行多次渲染。
(6)对高度进行缓存。这是开发者通常犯的另外一个小错误。每当需要一个新的 Cell 的时候,有两个主要方法要被调用。
(7)避免使用图形特效。在 Cell 上,有越多的图形特效,那么渲染的过程就会越缓慢。所以,你也应该对这点进行相关的测试。你应该使用 CoreAnimation来检查每个 UI 组件的渲染情况。
1.创建一个检查清单,以保证你在执行必要的,基本的优化步骤的时候,能让UITableViewCell 的相关性能变得更好。
B.实践
1.写一个小应用,来查看在有编辑操作和动画的时候,drawRect 是如何运行的。
2.实践在"复用图像"这一小节提到的练习。尝试着使用多线程技术来从文件中加载图像。