1.关于UItableView的优化现在网上已经有很多,无外乎以下几种
1.提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法(最好是在数据下载完成转model的时候在model里面计算)
2.滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!(SDWebImage已经实现异步加载,配合这条性能杠杠的
3.正确使用reuseIdentifier来重用Cells
4.尽量使所有的view opaque,包括Cell自身
5.尽量少用或不用透明图层
6.如果Cell内现实的内容来自web,使用异步加载,缓存请求结果
7.减少subviews的数量
8.尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示
9.尽量少使用cornerRadius和maskToBounds来设置圆角(maskToBounds很掉帧,可以以切图代替)
10.如果是图片列表为主的cell尽量不使用imageNamed来设置图片,使用imageWithContentsOfFile来代替(原因可看:http://blog.csdn.net/lg_sun/article/details/46895457)
提前计算并缓存好高度可以看一下我写的方法(可以使用自己的风格,我这只是个例子):
今天咱们来看一种导致掉帧的情况---------->cell里面循环创建view 导致卡顿掉帧
循环的addSubView是很掉帧杀手
这种情况还是比较多的,看一下我们的需求
单个cell是一个门店下边带最多5个商品,和不定量的商家推荐。这样的话里面的view1和view2就是根据后台数据循环创建的
先看一下未优化之前的tableVIew滑动帧数,也就是30左右(30以下用户可以明显感觉到屏幕的卡动,可以称为垃圾APP了)
未优化之前
优化过程:
既然最多时5个view1,那就用内存和cpu来换取流畅度吧
1.直接在cell初始化的时候创建5个view1,用isHiddent来控制显示个数
2.根据model数据来付值和判断view的显隐性
看一下优化之后tableVIew滑动帧数,差不多达到50 ,这是后看起来已经相当流畅了
但是这个时候还有一个问题,因为我们是分页加载,就是一次性加载10天数据,滑动到最后一条数据之后用户上拉加在下一个10条,这样在分页加载的时候还是有一个明显的加载过程
优化前代码:
优化后代码
这样用户就不会察觉分页加载数据的那个过程
提示:页面帧数可以用core animation(用真机,因为模拟器的cpu,内存都是虚拟的)