IOS研究成果——在autolayout 如何实现 Cell 的高度自适应

Hello,小编又来了,距离上次写博客都有一段日子了,主要是这个月一直在赶新项目,项目推了又改改了又推,需求被改无数,泪奔。。。但是在做项目的时候发现了好多小细节,等项目做完了就拿来给大家看看,好了,不再多废话了,回归我们今天的主题。

其势 Autolayout 技术再 IOS6的时候就已经开始有了,但是大多数人还是习惯不了这个看起来奇特的东西,而且官方文档做到根本不是人看的,但是现在越来越多的人开始使用 autolayout 了,为什么?因为好用呀,就是这么简单,以前辛辛苦苦算 frame 值,现在大家就只需要抛开他,拥抱我们的 autolayout 就可以了,当然也有一些特殊情况,这里先不说,那么,我们在用 autolayout 的时候会碰到一个问题,怎么让我们的 cell 自适应呢?大家都知道,以前我们让 cell 自适应的时候,都是通过在模型赋值的时候计算出内容的 frame 值,也就是我们经常说的 frameModel,但是这个方法很沉郁,辛辛苦苦拿内容过去慢慢计算,稍微算法不好的同学就在这里跪了,那么 autolayout 完全就帮到你了,因为 label 的高度都是自适应的,非常好用,在说这个技术之前希望之前不太懂 autolayout 的同学恶补一下。。。。毕竟时代在进步,技术不断更新,在这里推荐大家使用一个第三方进行更好的运用 autolayout,到 GitHub 搜索Masonry这个绝对的代码 autolayout 布局的神器。当 你布局发生问题时还会有很好的提醒让你发现的那里出问题了。点击这里

先说一下思想:
1.启用估计行高(IOS8)下的实现,当你开启此方法再要 autolayout 布局的时候,自适应已经开启了,但是这只是使用与 IOS8以上的系统,当运行到 IOS7的时候,就会崩溃了


    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 44.0; // 设置为一个接近“平均”行高的值,用来估算修正tableView滚动条的高度

这样做是为了让tableView 上显示的 cell 临时的估计一个行高,主要使用来修改 tableView 右侧滚动条的大小,告诉它我下面还有多少内容,你自己看着办。但是一旦当 cell 出现在屏幕的时候这个值就会重新被计算,所以有时候我们设置的估算只比较少的时候,会出现一个滚动条跳跃的情况,这个会出现在估算一个 cell 的高度跟实际 cell 的高度相差比较大的时候出现,这个时候,你才应当实现tableView:estimatedHeightForRowAtIndexPath:方法,为每一行返回一个更精确的估算值。

IOS7下支持的方法(需要自己实现 cell 尺寸的自适应功能)

2.1创建一个用作缓存的实例,cacheCells
当然你要为在这个 tableView 显示的每一种 cell 都必须给一个重用的标识符,因为每一种cell 的布局不同,被估算出来的高度也会不相同的,这些 cell 完全是用作高度计算的,绝对不会被用作tableView:cellForRowAtIndexPath:方法的返回值以实际呈现在屏幕上。)接着,这个cell的内容(例如,文本、图片等等)还必须和会被显示在table view中的内容完全一致。

2.2使用估算行高
当你一加载程序进来的时候,你的 tableView 中已经有几十行 Cell,你会发现自动布局约束的解决方式在第一次加载table view的时候会迅速地卡住主线程。这是因为tableView在第一次加载中会调用 tableView:heightForRowAtIndexPath:方法(主要就是为了计算滚动条的大小)
所以在 IOS7中,你绝对可以使用estimatedRowHeight,让滚动条拥有一个估算的值,让不在屏幕中的 cell 告诉滚动条,我应该有多高,滚动条就会根据估算值而显示大小,然而,这些 cell 都会在显示在屏幕的时候计算出真实高度,那么滚动条也跟着改变。
上面也说过,如果使用估算值的话,当 cell 的高度与被估算的高度严重不匹配的时候,滚动条会有跳跃现象,这个时候,你才应当实现tableView:estimatedHeightForRowAtIndexPath:方法,为每一行返回一个更精确的估算值。

  1. 缓存行高(如果需要)
    如果上面提到的你都做了,但是tableView:heightForRowAtIndexPath
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值