过程:在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))
网友评论