UITableView的性能优化归根结底就是平衡GPU跟CPU的负载均衡,主要优化途径包括
1.利用苹果提供的cell重用机制。
2.不要在 cellForRowAtIndexPath: 方法绑定数据,因为这时 cell 还没显示,而是使用 UITableViews 的委托方法 tableView:willDisplayCell:forRowAtIndexPath:。
3.缓存cell的高度,分为两种情况:1.当cell的高度都是一样的时候,直接给tablview设置rowheight 2.当cell高度不固定的 时候,在绑定model的时候,就把cell的高度计算出来,作为model的一个属性进行缓存。
4.复杂的cell尽量不适用autolayout,改用frame。因为autolayout会损耗一部分计算性能。
5.减少子view的数量跟层级。子view的层级越深,渲染到屏幕上的计算量也就越大
6.对于不透明的view,设置opaque为YES,在绘制这个view的时候就不需要考虑view覆盖的情况
7.UIView的drawRect方法中使用CoreGraphic来进行CPU的渲染,减少对于GPU的负载。也就是减少cell中UIView,UIImageView,UILabel的使用。
8.cell layer的shouldRasterize要设置为YES
9.cell中的图片使用异步加载策略,防止卡住主线程
10.尽量少用不透明的图层,也就是说吧图层的alpha设置为1
11.尽量不要用addsubview给cell动态的添加view,可以在初始化的时候添加,但是通过hidden属性来控制是否显示
12.尽量使用大小一致的图片,也就是为了防止由于大小不一致造成的图片缩放的开销。
13.设置mask,shadows,opacity,antialiasing会触发离屏渲染,因此要避免使用这些属性。还有设置图片的圆角也会触发离屏渲染,所以可以考虑把绘制操作放在后台线程中执行,绘制完成之后回到主线程进行操作。如果需要在cell中使用上面的属性,可以加上下面两行代码:
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
14.尽量创建一种类型的cell,可以传入不同的cell类型进行区分,从而创建出不同样式的cell。