UITableView滚动流畅性优化

117 篇文章 0 订阅

在论坛里看到的,现在转载分享给大家,希望可以给大家带来帮助。

一、UITableView的执行流程

这里指出了影响其性能的代理方法heightForRowAtIndexPath和cellForRowAtIndexPath。
1.初次加载UITableView的时候,首先循环调用heightForRowAtIndexPath得到每一行cell的高度;之后循环调用cellForRowAtIndexPath得到当前屏幕可见的cell(也就是说并不是得到全部的cell,之后在滚动UITableView的时候才再次调用cellForRowAtIndexPath)。
2.调用UITableView的reloadData、insertRowsAtIndexPaths、deleteRowsAtIndexPaths都会循环调用heightForRowAtIndexPath得到每一行cell的高度

二、影响UITableView滚动流畅性的原因

由上述描述可以看出,原因主要由两点。
1. heightForRowAtIndexPath中做了大量的计算。
2. cellForRowAtIndexPath中cell的组织过于复杂。

三、解决方案

1. heightForRowAtIndexPath中做了大量的计算 
例如:当cell的高度不固定时候,传统的方式是传入那些影响高度的元素(如文字、图片)然后返回计算出高度。当然这没问题,但是当在有大量的reloadData、insertRowsAtIndexPaths、deleteRowsAtIndexPaths操作的时候就会产生大量的不必要的计算操作,影响了软件的性能。
解决:尽可能呢让计算的复杂度为O(1),也就是cell的高度最好是直接取出来就能用。具体实现方法就是,在UITableViewController中定义一个用来存储cell高度的数组,在异步获取到网络数据(或者其他方式获取数据)的时候就计算出cell的高度放在数组中。

2. cellForRowAtIndexPath中cell的组织过于复杂
(1)重用cell,除特殊情况cell中的所有subview都应该只创建一次,之后每次都应该去刷新其数据,因此当自定义的view用在cell当中的时候需要该view提供刷新其数据的方法。
(2)当cell中需要显示网路图片的时候,你可能会用会用UIImageView的contentMode属性以及自定义算法对图片进行压缩、裁剪处理,而这会耗掉较多资源。如果你这样的图片操作很多,你可以从网络拉去到图片之后,立即对图片进行压缩、裁剪。
(3)如果需要更高的流畅度,你可以手动Drawing视图

四、小技巧
1.当你的cell的高度全部统一的时候,设置UITableView的rowHeight属性比实现heightForRowAtIndexPath方法效率会高。


参考文章:http://www.cocoachina.com/applenews/devnews/2014/0210/7792.html

转自:http://www.cocoachina.com/bbs/read.php?tid=183909&fpage=4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值