现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好的体验效果,如何做好tableView的优化将是很重要的一环.
>1. 要保证滚动tableView时,让用户有良好的体验,需要确保刷新帧率应该在 50+/s 才可以!(instrument中CoreAnnimation中可查看)
>2. 不能因为cell展示不必要的内容浪费时间,出现跳帧现象,导致画面不连续,y也就是说在两帧刷新之间,表格的运算必须做完,
一句话:要想滚动tableView时,能够非常流畅,最关键的是在创建cell或者从缓存池取cell时,让系统花费最少的时间,即尽可能的减少显示cell的计算量.
tableView的性能优化可以从下面几个方面着手: 1.行高一定要缓存!!! 2.不要动态创建子视图 3.所有的子视图都应该添加到 contentView 上 4.所有的子视图都必须指定背景颜色 5.所有的颜色都不要使用 alpha 6.cell 栅格化 7.异步绘制 8.tableview加载图片的时候使用lazy(懒加载)模式和异步加载模式 9.正确使用reuseIdentifier来重用Cells
一一进行讲解: 1.行高要缓存 举个简单的栗子: 如果现在要显示100个Cell,当前屏幕显示5个。那么全局刷新UITableView时, UITableView会先调用100次tableView:heightForRowAtIndexPath:方法,然后调用5次 tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用 一次tableView:heightForRowAtIndexPath:和tableView:cellForRowAtIndexPath:方 法。 所以说要提前计算并缓存好高度,因为heightForRowAtIndexPath:是调用最频繁的方法,如果是使用MVVM搭建框架,可以在viewModel中添加行高属性,提前计算好行高.
2.不要动态创建子视图 意思是:cell所有的子视图都预先在初始化方法中创建,如果根据实际情况不需要显示的可以设置 hidden.这样能尽可能的减少cell创建或从缓存池取时因为布局子控件所消耗的时间.
3.所有的子视图都应该添加到 contentView 上 这一条和tableView的性能优化其实没多少关系,但添加到contentView中,当侧滑cell需要删除或编辑这行数据时更好操作.
4.所有的子视图都必须指定背景颜色 相信很多程序员在开发时经常会遇到这种情况,当从某个控制器A跳转到下一个控制器B时,若B控制器的view未设置背景颜色,跳转时会有卡顿现象,cell也一样,若控件未指定背景颜色,会影响tableView滚动的流畅度.
5.所有的颜色都不要使用 alpha 因为控件如有透明度,会显示底部控件的部分轮廓,系统在显示cell时,需要计算各控件间的叠加面积,颜色的透明度等;但如果所有控件颜色不透明,则不需要耗费性能去计算,能节省大量时间.
6.cell 栅格化 栅格化,是UI设计师的术语:是将 cell 中的所有内容,生成一张独立的图像,在屏幕滚动时,只显示图像 设置属性 self.layer.shouldRasterize = YES;即可 栅格化的同时必须指定分辨率,否则默认使用 1倍的scale 生成图像! 需要设置 self.layer.rasterizationScale = [UIScreen mainScreen].scale;
7.异步绘制 异步绘制!如果 cell 比较复杂,可以设置cell图层的属性 self.layer.drawsAsynchronously = YES;
8.tableview加载图片的时候使用lazy(懒加载)模式和异步加载模式 举个栗子,当我们在用新闻类的App时,滑动cell时看新闻时,并不是所有的都是我们感兴趣的,有时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但实际上只要滑动经过了的cell中的图片就开始加载了,这样用户使用起来会出现不同程度的卡顿,用户体验不太好,而且浪费内存和流量 此时,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.
9.正确使用reuseIdentifier来重用Cells 当一个tableView中有多种类型的cell时,需要定义不同的重用标识,确保在缓存池正确找到重用的cell.