说明

TableViewCell 几乎是必用控件,使用 TableViewCell 免不了计算其 cell 高度,网上也有非常多关于 TableViewCell 高度自适应的文章,自己也尝试总结了计算cell高度的几种方法。

TableViewCell 的行高计算

固定行高时

Cell高度固定图

如图所示:Cell 的格式是固定的,有一个固定高度,这种情况可以通过行高属性 rowheight 及行高方法 heightForHeaderInSection 来设置

行高不固定时

Cell高度变化图

如图所示:UILabel 的文字长度是不固定的,有的 Cell 含有配图,有的 Cell 不含配图,所以 Cell 的高度不能写死。需要根据数据的情况,让 Cell 自适应高度。

Cell 自适应高度的方法

方法一:通过 sizeThatFits 或 boundingWithRect 计算UILabel高度 从而计算 Cell行高

对于 UIImageView 的处理:

使用masonry对图片添加约束,当设置数据源的时候:
– 若有图片则使用SDWebImage 设置图片。
– 若无图片,则不设置图片,使用 mas_updateConstraints 更新约束将图片高度设置为0.

对于 UILabel 的处理:

计算UILabel高度即可:至于计算UILabel高度的计算方式,不管是普通文字的 text, 还是富文字的 attributedText 都可以通 sizeThatFits 或 boundingWithRect,计算出 UILabel的高度,详细计算方法参考另一篇文章UILabel 设置内容的间距及高度的计算

行高的计算

由以上两步,分别计算出 UIImageView 的高度 imaeViewHeight、UILabel 的高度labelHeigh。此时 Cell 的行高就可以通过 imageViewHeight + labelHeight 计算出行高 cellHeight, 此时将cellHeight通过模型来保存: model.cellHeigh = imageViewHeight + labelHeight ,方便以后调用 。

最后通过 heightForRowAtIndexPath 来设置该行行高

方法二: 通过 autoLayout 设置估计高度,来自适应高度

此方法适用于 iOS8 之后版本

对于 UIImageView 的处理:

使用 masonry 对图片添加约束,当设置数据源的时候:
– 若有图片则使用SDWebImage 设置图片。
– 若无图片,则不设置图片,使用 mas_updateConstraints 更新约束将图片高度设置为0.

对于 UILabel 的处理

只需要在设置数据源之后,调用 [contentLabel sizeToFit];

行高设置方法

  • 使用属性: self.tableView.estimatedRowHeight = 100; //设置估计高度
  • 设置高度: self.tableView.rowHeight = UITableViewAutomaticDimension; //
    设置 rowHeight 默认值

这样 Cell 就可以自适应高度了。
此时,会自适应高度,所以 heightForRowAtIndexPath 方法设置高度就没有效果。
– (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { } 失效。

方法三: 使用第三方框架 UITableView+FDTemplateLayoutCell

使用UITableView+FDTemplateLayoutCell,就算比较复杂的界面,只需要调用 fd_heightForCellWithIdentifier 即可轻松解决。
此框架使用方法非常简单,
1. 首先检查:Cell 中 Y 方向约束设置完整。
3. 然后检查:是否注册 cell, registerClass。
4. 导入头文件:UITableView+FDTemplateLayoutCell.h。
5. 在-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ }方法中调用 API。

API 设置方法如下:

在设置数据时,若图片为空,则不需要设置图片,及清零图片高度:

ViewDemo

发表评论

电子邮件地址不会被公开。 必填项已用*标注