美文网首页iOS常用
IOS UITableViewCell高度自适应最简单的实现方式

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

作者: 你duck不必呀 | 来源:发表于2020-08-05 11:12 被阅读0次
配图.jpg

一、第一种,最简单的方式就是利用自动布局

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高度不能选!!!


image.png
image.png

这样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:] //获取高度方法

相关文章

网友评论

    本文标题:IOS UITableViewCell高度自适应最简单的实现方式

    本文链接:https://www.haomeiwen.com/subject/icrnrktx.html