UITableViewCell根据内容显示不同的高度问题

1.iOS8及以后,通过XIb自定义不等高cell:        下载

// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)self.tableView.rowHeight = UITableViewAutomaticDimension;

// 告诉tableView所有cell的估算高度

self.tableView.estimatedRowHeight = 44;

注意一点的是在Xib中设置自动换行Lable的时候要设置lable和cell底部的约束如图:

UITableViewCell根据内容显示不同的高度问题_第1张图片

运行效果如下:

UITableViewCell根据内容显示不同的高度问题_第2张图片

2.(估计现在都没人用了简单介绍一下)如果要支持iOS7及之前如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性

1.如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性

- (void)awakeFromNib

{// 手动设置文字的最大宽度(为了让label知道自己文字的最大宽度,进而能够计算出自己的frame)

self.titleLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;

}

2.还要在tableView的设置cell估算高度

// 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)

self.tableView.estimatedRowHeight = 80;

3.在代理方法中计算cell的高度

DemoCell *cell;

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

// 创建一个临时的cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度)

if (!cell) {

cell = [tableView dequeueReusableCellWithIdentifier:ID];

}

// 设置模型数据

...

return cell.height;

}

// heightForRowAtIndexPath中调用的返回cell高度的方法

- (CGFloat)height

{

// 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)

[self layoutIfNeeded];

// 计算cell的高度

if (...) {

return ...;

} else {

return ...;

}

}

3.通用规则代码设置

设置思路如下:

UITableViewCell根据内容显示不同的高度问题_第3张图片

所有涉及基于纯代码原则

1.建立Modle模型

2.根据Modle模型建立framModle模型并计算出控件的Fram

3.在cell中设置子控件并设置Fram

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

if (self) {

//设置子控件

[self setupchildrenView];

}

return self;

}


- (void)setFramModle:(myFootPrintFramModle *)framModle{

_framModle=framModle;

myFootPrintDataModle *dataModle=framModle.modle;

//设置控件的Fram和数据

}

4.在代理方法设置返回的行高

- (CGFloat )tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

myFootPrintDataSectionModle *Modle=self.dataArray[indexPath.section];

myFootPrintFramModle *framMod=Modle.dataArray[indexPath.row];

return framMod.cellHeight;

}

简述一下方法一和方法三的优缺点:

方法一:对于一些比较简单的界面,如上图,Xib拖控件两句话就可以搞定很方便。缺点就是比如下面的界面就不好控制了:

UITableViewCell根据内容显示不同的高度问题_第4张图片

实现根据数据的不同,排列图片,以及对下面转发,评论,点赞工具条的设计,这个很明显把图片和工具条单独的功能繁多我们需要分开来写,这样就需要代码进行实现了(这个只是本人的思路),具体根据开发遇到的问题决定

你可能感兴趣的:(UITableViewCell根据内容显示不同的高度问题)