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/ 大伙可以自行研究研究
推荐阅读
- react.js|React(9)—— Hooks - LazyLoad - Context - 组件优化 - 错误边界 - 组件通信方式总结
- 现代化个人博客系统 ModStartBlog v5.5.0 附件归档优化,管理角色备注
- Java使用NIO优化IO实现文件上传下载功能
- 网站手机版制作优化的5个注意事项
- mybatis|mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化
- 后端开发|【学习笔记】MySQL数据库高级版 - 索引优化、慢查询、锁机制等
- 【培训人成长】如何优化培训效果(提供适合学员且有针对性的培训?)
- Node.js|typeorm 批量插入数据优化和插入冲突操作
- Android系统优化Ninja加快编译
- React|<react求和案例>react-redux基本使用与优化——Provider/mapDispatch