
一、第一种,最简单的方式就是利用自动布局
1.首先是UITableView,需要设置两个属性
estimatedRowHeight
预估的行高,取个平均值就可以
rowHeight
设置为 UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100;
self.tableView.rowHeight = UITableViewAutomaticDimension;
注意,不要实现行高的代理方法,否则无效
//不要实现这个方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 100;
}
2.接下来是,UITableViewCell的设置,需要用到自动布局(xib,autolayout),建议使用 Masonry或者 xib
重点:需要在UITableViewCell 的Y轴上添加完整的约束
例如:在Cell的视图上,添加UILabel,就要设置Cell的top,bottom相对于UILabel的top, bottom(设置UILabel的numberOfLines = 0)
Masonry的方式
[self.label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.contentView.mas_top).offset(15);
make.bottom.equalTo(self.contentView.mas_bottom).offset(-15);
}];
xib的方式,Height高度不能选!!!


这样cell的高度就跟着label的高度变化了
二、手动计算文本高度
1.字符串,通过下面这个方法计算文字高度
@param size 要计算的区域,如果计算高度,就限定宽度让高度无限大
@param options 枚举值,按什么计算方式 一般都是NSStringDrawingUsesLineFragmentOrigin (整个文本将以每行组成的矩形为单位计算整个文本的尺寸)
@param attributes 文字属性字典,一般只需要字体就可以了
@param context 状态机,填nil就可以
- (CGRect)boundingRectWithSize:(CGSize)size
options:(NSStringDrawingOptions)options
attributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attributes
context:(nullable NSStringDrawingContext *)context
API_AVAILABLE(macos(10.11), ios(7.0));
例如:label的高度
//MAXFLOAT 最大浮点数,因为我们计算高度,所以限定宽度,高度放开
CGRect rect = [self.label.text boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]}
context:nil];
//上取整,并转换成float 例如: 2.1,2.9 都会转成 3.0
ceilf(rect.size.height);
如果有多个label需要计算高度,最好分装成方法,方便调用
2.接下来把计算出的文本高度保存到model模型中去,然后在tableView刷新的时候获取这个高度更新cell高度
需要实现tableView获取高度的方法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return self.modelArray[indexPath.row].cellHeight;
}
之所以可以这样做,是因为table reloadData 时调用方法的顺序是:cellForRowAtIndexPath方法在 heightForRowAtIndexPath之前调用
-[ViewController tableView:cellForRowAtIndexPath:] //cell 创建方法
-[ViewController tableView:heightForRowAtIndexPath:] //获取高度方法
网友评论