您的位置:首页 > 其它

cell高度自适应实现的最简单方式

2017-01-05 16:10 656 查看
曾经为了实现cell的高度自适应,不知道吃了多少苦。那个时候,是在我的数据模型model中添加一个height属性,实现它的get方法,在get方法中计算需要多行显示文字的高度,然后再加上其他乱七八糟的高度并返回,然后在tableview的

- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath中获取到每行对应的model,取出其中的model.height属性的值返回,还要在cell中确定cell中label的高度。。。总之就是很麻烦,而且还不一定总能算的很正确,甚是受此困扰。

后来有一天,我终于发现了一个不得了的秘密,只要你懂一定的Autolayout知识的话,原来实现这种的cell高度自适应,其实是灰常灰常简单的:

首先,第一步,现在自定义的cell中将高度随着内容动态改变的label的布局使用autolayout布局完成,这里有个注意点就是label和cell边界的距离要确定好,不能固定死label的高度,然后设置label的numberOfLines=0,行数设置为0即意味着label可以有任意行。

其次,实现以下两个tableview的delegate中的方法:

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 10;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}


是的,只要实现这两个方法,然后运行你的项目,你会惊讶的发现,哇塞,高度完美自适应…

这里有几个关键点:

关键点1:必须重写estimatedHeightForRowAtIndexPath方法

这个方法是iOS7.0之后才出现的,如果不重写此方法,仅重写heightForRowAtIndexPath,那么大家会发现,cell并不会根据label的内容,自适应高度。因为系统是先获取cell的高度,再获取cell的view。也就是先调用heightForRowAtIndexPath,再调用cellForRowAtIndexPath。在cellForRowAtIndexPath被调用之前,你的label是没有被设置文本内容的,因此它获取到的高度,并不是你想要的。那么我们必须想办法让系统在获取了cell之后,再获取cell的高度。方法就是,重写estimatedHeightForRowAtIndexPath,顾名思义,它会返回一个估计高度,有了这个方法后,tableview会先调用它获取估计高度,然后获取cell,最后获取真实高度。estimatedHeightForRowAtIndexPath的返回值可以随意,返回多少都可以,只是给tableview一个安慰而已,让它延迟获取真实的高度。

关键点2:真实高度返回值为

UITableViewAutomaticDimension

关键点3:cell中的元素,必须相对于cell的顶部和底部布局,这样在元素中的内容动态变化的时候,才能撑开cell
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: