iOS UITableView的性能优化
2019-04-16 本文已影响84人
Lxin_
UITableView作为iOS中使用最频繁的控件之一,其性能优化也是要常常面对的,尤其是当数据量偏大且设备性能不足时。UITableView该从那几处开始优化,本文将详细阐明。
病因
治病就要先知道病因,我们先分析一下影响UITableView性能的因素
-
tableviewCell
的height
计算不合理。 -
tableView: cellForRowAtIndexPath:
方法中处理了过多业务。 -
tableviewCell
的subview
层级太复杂,做了大量透明处理。
解决方案
高度计算
- 定高Cell,设置
self.tableView.rowHeight = 88;//rowHeight默认的值是44
,不需要实现tableView: didSelectRowAtIndexPath:
方法,以节省不必要的计算和开销 - 动态高度Cell,自从iOS8之后有了self sizing cell的概念,cell可以自己算出高度,使用self sizing cell需要满足以下三个条件:
// 1.使用Autolayout进行UI布局约束(要求cell.contentView的四条边都与内部元素有约束关系)
// 2.指定TableView的estimatedRowHeight属性的默认值
self.tableView.estimatedRowHeight = 44.0;
// 3.指定TableView的rowHeight属性为UITableViewAutomaticDimension
self.tableView.rowHeight = UITableViewAutomaticDimension;
除了提高cell高度的计算效率之外,对于已经计算出的高度,我们需要进行缓存,对于已经计算过的高度,没有必要进行计算第二次。
tableView: cellForRowAtIndexPath:
- cell复用
- 实例对象在
tableView: cellForRowAtIndexPath:
创建,绑定数据放在tableView:willDisplayCell:forRowAtIndexPath:
中 - 图片显示异步加载
tableviewCell的subview层级
- 不要使用透明背景、不要使用阴影渐变
- 减少视图的数目,在UIView的drawRect方法中自定义绘制
- 不要给cell动态添加subView,在初始化cell的时候就将所有需要展示的添加完毕,然后根据需要来设置hide属性显示和隐藏。
- layer.mask/layer.masksToBounds/layer.cornerRadius等圆角会造成离屏渲染,尽量用贝塞尔曲线实现