UITableView 性能优化(卡问题自检)
1.使用不透明视图。
不透明的视图可以极大地提高渲染的速度。因此如非必要,可以将table cell及其子视图的opaque属性设为YES(默认值);
其中的特例包括背景色,它的alpha值应该为1(例如不要使用clearColor);
图像的alpha值也应该为1,或者在画图时设为不透明。
2.减少视图的数目。
view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。
最佳的解决办法还是继承UITableViewCell,并在其drawRect:中自行绘制:
- (void)drawRect:(CGRect)rect
{
if (image)
{
[image drawAtPoint:imagePoint];
self.image = nil;
}
else
{
[placeHolder drawAtPoint:imagePoint];
}
[text drawInRect: textRect withFont: font lineBreakMode: UILineBreakModeTailTruncation];
}
此外还可以创建CALayer,将内容绘制到layer上,然后对cell的contentView.layer调用addSublayer:方法。这个例子中,layer并不会显著影响性能,但如果layer透明,或者有圆角、变形等效果,就会影响到绘制速度了。解决办法可参见后面的预渲染图像。
3.不要做多余的绘制工作。
在实现drawRect:的时候,它的rect参数就是需要绘制的区域,这个区域之外的不需要进行绘制。
4.预渲染图像。
你会发现即使做到了上述几点,当新的图像出现时,仍然会有短暂的停顿现象。解决的办法就是在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕,详细做法可见《利用预渲染加速iOS设备的图像显示》。
5.不要阻塞主线程。
另外,自动载入更新数据对用户来说也很友好,这减少了用户等待下载的时间。例如每次载入50条信息,那就可以在滚动到倒数第10条以内时,加载更多信息:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (count - indexPath.row < 10 && !updating)
{
updating = YES;
[self update];
}
}// update方法获取到结果后,设置updating为NO
6,数据获取后过多的计算也很影响性能。