公司开发的项目中有一个类似朋友圈的功能,包括九宫格图片、文字,在项目中对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/ 大伙可以自行研究研究
网友评论