TableView为什么会卡?

TableView为什么会卡?

主要由以下原因:

cellForRowAtIndexPath:方法中处理了过多业务

tablev

iewCell的subview层级太复杂,做了大量透明处理

cell的height动态变化时计算方式不对

优化核心思想:UITableViewCell重用机制

简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。

Tips:

提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;

异步绘制,遇到复杂界面,参考Facebook的AsyncDisplayKit和YYAsyncLayer异步绘制框架;

缓存图片(SDWebImage),提前处理好UIImageView图片的尺寸按需加载而不是加载原图;

计算等耗时操作异步处理,处理完再回主线程更新UI;

图文混排不定高度采用CoreText排版,缓存Cell高度参考YYKit;

实现Cell的drawRect:方法直接绘制,减少UIView,UIImageView,UILabel等容器的使用。

Bonus:

正确使用reuseIdentifier来重用Cell;

尽量少用或不用透明图层或View;

如果Cell内现实的内容来自web,使用异步加载,缓存请求结果;

减少subviews的数量在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果;

尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示;

固定高度不要实现heightForRowAtIndexPath:方法。

1.UITableViewCell里不要添加太多subview,最好只添加一个cellview。

2.UITableViewCell 上的子View的opaque属性设为YES。其实默认也是不透明。UITableViewCell尽量不要包含透明的子View。

3.在cellview里,重写drawRect函数绘制UITableViewCell的内容。

4.在绘制字符串时,尽可能使用drawAtPoint: withFont:,而不要使用更复杂的drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode; 如果要绘制过长的字符串,建议自己先截断,然后使用drawAtPoint: withFont:方法绘制。

5.在绘制图片时,尽量使用drawAtPoint,而不要使用drawInRect。drawInRect如果在绘制过程中对图片进行放缩,会特别消耗CPU。

6.如果绘制cell过程中,需要下载cell中的图片,建议在绘制cell一段时间后再开启图片下载任务。譬如先画一个默认图片,然后在0.5S后开始下载本cell的图片。

7.即使下载cell 图片是在子线程中进行,在绘制cell过程中,也不能开启过多的子线程。最好只有一个下载图片的子线程在活动。否则也会影响UITableViewCell的绘制,因而影响了UITableViewCell的滑动速度。(建议结合使用NSOpeartion和NSOperationQueue来下载图片,如果想尽可能找的下载图片,可以把[self.queuesetMaxConcurrentOperationCount:4];)

8.最好自己写一个cache,用来缓存UITableView中的UITableViewCell,这样在整个UITableView的生命周期里,一个cell只需绘制一次,并且如果发生内存不足,也可以有效的释放掉缓存的cell。

9.不要将tableview的背景颜色设置成一个图片。这回严重影响UITableView的滑动速度。在限时免费搜索里,我曾经翻过一个错误:self.tableView_.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"background.png"]]; 通过这种方式设置UITableView的背景颜色会严重影响UTIableView的滑动流畅性。修改成`self.tableView_.backgroundColor` = [UIColor clearColor];之后,fps从43上升到60左右。滑动比较流畅。

10.cell的行高不是固定值,需要计算,则要尽可能缓存行高值,避免重复计算行高。这里指的是UITableViewDelegate里的行高函数。

如果做到以上10点,则UITableView 滑动的fps可以达到60 fps。滑动非常顺畅

你可能感兴趣的:(TableView为什么会卡?)