问答 ——如何加强 iOS 里的列表滚动时的顺畅感?

来源:互联网 发布:用友软件好学吗 编辑:程序博客网 时间:2024/04/20 03:23


如果你想要如丝般顺滑的效果,那么:
1、每次都看一下有没有能重用的 cell,而不是永远重新新建(这个是 UITableView 的常识)
2、Cell 里尽量不要用 UIView 而是全部自己画
3、图片载入放到后台进程去进行,滚出可视范围的载入进程要 cancel 掉,需要显示多大图片就加载多大的图。比如图片墙,如果接口返回的图片没有小图,可以用程序处理成小图缓存起来,然后实际加载小图,这样可以很大程度加快滚动时的渲染速度,提高运行效率,注意,这里说的处理成小图不是UIImageView压缩成小图,而是直接把UIImage处理成小图,因为UIImageView虽然显示出了小图,但实际上渲染的还是大图
4、圆角、阴影之类的全部 bitmap 化,或者放到后台 draw 好了再拿来用
5、Cell 里要用的数据提前缓存好,不要现用现去读文件
6、数据量太大来不及一次读完的做一个 load more cell 出来,尽量避免边滚边读数据,这样就算是双核的 CPU 也难保不会抽

做到以上6条的话,应该就能做出很顺畅的滚动了(现在的 Twitter 官方客户端的原作者写过一篇文章,总结起来也无非就是我说的前3条,可以找来看看)。

Path 2.5 的那个滚动说实在的不是很顺畅,图片显示出来的时候都会抽一下,他们还有很大的改进余地。

对于3的补充说明:UIImageView 的载入是惰性的说法,是对的。[UIImage imageWithContentOfFile:] 出来的 UIImage 其实并没有真正把文件读入内存,而是要等到用的时候才会去读。但问题就在于 UIImageView 试图去 draw 图片的时候,它读文件、渲染也是在主线程里做的,所以你要读入的图片如果很大(比如 iPad3 上的 @2x 图),不管 iOS 做了何种优化,这一步是一定要卡的。这也就是为什么我说图片要放到后台进程读出来、scale好再用。



另外有人写了一篇关于UITableView滚动流畅性优化的文章,有兴趣的童鞋可以看看! 点击打开链接 

原创粉丝点击