tableView性能优化与手动绘制cell内容

【tableView性能优化与手动绘制cell内容】公司开发的项目中有一个类似朋友圈的功能,包括九宫格图片、文字,在项目中对tableView进行了一些优化。

UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:以确定contentSize及Cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示在当前屏幕的Cell。 比如:如果现在要显示20个Cell,当前屏幕显示5个。那么刷新(reload)UITableView时,UITableView会先调用20遍tableView:heightForRowAtIndexPath:方法,然后调用5遍tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。

优化方法:
1、缓存行高(缓存高度是最有效的额) 2、尽量少计算,所有需要的素材提前计算好 3、设置控件的圆角不使用layer属性,使用贝塞尔曲线设置圆角 4、不动态创建控件,所有需要的控件都提前创建好,在显示的时候根据数据隐藏或显示 5、UITableViewCell的控件越少越好 6、UITableViewCell设置异步绘制:self.layer.drawsAsynchronously = YES; UITableViewCell设置栅格化,self.layer.shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.main().scale; (会触发离屏渲染,尽量少用) 8、对于UITableViewCell显示图片则在后台根据控件大小剪切生成新的图片,防止图片拉伸消耗性能 9、设置UITableViewCell上控件的背景颜色,少用或不用透明图层 10、UITableView滚动时可禁止网络请求 11、尽量使所有的view opaque,包括Cell自身 12、按需加载 - 如果目标行与当前行相差超过指定行数,只在目标滚动范围的前后指定行数加载。

如果以上的方法没办法解决你的问题,你可以选择手动绘制cell的内容,实际上我们往cell添加控件最终也是系统调用绘制方法进行绘制显示内容。 当UITableViewCell拥有多个子视图时,IOS的渲染机制会拖慢速度。重写drawRect直接绘制内容的方式可以提高性能,而不是在类初始化的时候初始化一些label或者imageview等。

最后sunnyxx
大神提出了很好的优化方案:http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/ 大伙可以自行研究研究

    推荐阅读