iOS开发 非等高cell

682 阅读2分钟

前端开发中列表页直接用循环创建单元格,只要单元格在标准流中就会自动往下排列,在前端开发中并不需要多注意cell的高度,但是在iOS开发中,由于tableview的单元格复用机制,所以我们必须要在代理方法里面向tableview提供每个cell的高度,如果是等高的话直接在代理方法里面写死就行


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

return 100;

}



或者tableview.rowHeight = 100 就行


对于非等高的情况下,则需要我们具体计算高度

UITableview继承自UIScrollview  所有他们都有个contentSize    这个contentSize就算内容的高度,根据这个contentSize才可以显示滚动条,UITableview在加载或者刷新的时候会先执行heightForRowAtIndexPath 这个方法,有多少条数据就执行多少次,把这些高度加起来就能得到UITableview的contentSize  这样UITableview就能被撑开了,所以在heightForRowAtIndexPath就需要我们计算高度。

一.直接在heightForRowAtIndexPath 中计算高度。这个需要我们在这个方法里面执行计算高度的逻辑,具体逻辑要看cell内部布局(反正我从来不用这个方法,因为我懒)

二.在cell中计算高度。在cell中计算高度就比较简单,iOS8以后UITableview有一个新方法estimatedRowHeight  在这个方法中我们传递一个预估的高度(尽量接近真实高度),UITableview在加载或者刷新的时候就会访问这个方法代替heightForRowAtIndexPath,这样就可以给定一个预估的contentSize,在具体加载到每一个cell的时候在访问heightForRowAtIndexPath方法,根据这个方法返回每个cell的具体高度,方法执行顺序:

estimatedRowHeight-->cellForRowAtIndexPatch-->heightForRowAtIndexPath 

就是先加载cell再提供高度,至于cell的高度,我们再自定义的cell里面在cell的layoutSubview中就能得到,吧这个高度放在model里面 ,在heightForRowAtIndexPath中再冲model中取出就行,这样省下来很多的计算高度方法。

三.自动计算高度。在cell的布局中,很多小伙伴都使用xib进行布局,只要我们给cell宇哥自上而下的约束再利用

tableview.estimatedRowHeight = 150

tableview.rowHeight = UITableViewAutomaticDimension

这样系统就会直接给我们计算cell的高度,这个方法是最简单的,但是一定要注意必须要构造一个自上而下的约束(自上而下的约束如果有冲突的话没冲突的约束中将relation由Equal变成Less than or Equal  或者Greater that or Equal 就行 这两个意味着小于或者等于,大于或者等于 )



注意:方法二方法三会造成一点点滚动条高度跳动的不良现象