美文网首页
iOS中UITableViewCell的高度缓存

iOS中UITableViewCell的高度缓存

作者: lanmoyingsheng | 来源:发表于2018-07-12 15:20 被阅读192次

过程:在model中添加描述cell高度的字段;在cell显示前(不是cell加载时)计算出cell的实际高度。

方法一:

找一个tempCell做全局变量,每次调用heightForRowAtindexPath时,判断model中的高度是否大于0。如果等于0,使用tempCell和本次的model计算出高度,然后存到model的heigth中;如果不等于0,直接返回model的height值。
参考:AutoLayout框架Masonry使用心得

方法二:

实现方法

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat

tableview会先访问estimatedHeightXXX方法,接着访问cellForRowAtXXX方法,最后访问heightForRowAtXXX。

官方的文档:Using estimation allows you to defer some of the cost of geometry calculation from load time to scrolling time.

这里我们可以在cellForRowAtXXX方法中赋值model时,顺便计算cell需要的高度,并将值返回给model的height字段。当走到代理方法heightForRowAtXXX时,直接返回已经计算好的model的height。
需要注意的是,在swift中model类型必须是引用数据类型而不是值类型。

补充:当在cellForRowAtXXX方法中:

如果带indexPath方式的注册时,不走完cellForRowAtXXX方法就会多次调用heightForRowAtXXX方法,然后继续执行cellForRowAtXXX,最后再走heightForRowAtXXX方法,虽然最后cell的高度可能差不多,但是代码执行路线已经变了,调试的时候需要注意。
tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(UITableViewCell.self), for: indexPath)

而不带indexPath的方法不会出现前者的现象。
let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(UITableViewCell.self))

相关文章

网友评论

      本文标题:iOS中UITableViewCell的高度缓存

      本文链接:https://www.haomeiwen.com/subject/lkjlpftx.html