UITableViewCell根据内容显示不同的高度问题
1.iOS8及以后,通过XIb自定义不等高cell: 下载
// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)self.tableView.rowHeight = UITableViewAutomaticDimension;
// 告诉tableView所有cell的估算高度
self.tableView.estimatedRowHeight = 44;
注意一点的是在Xib中设置自动换行Lable的时候要设置lable和cell底部的约束如图:
运行效果如下:
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.通用规则代码设置
设置思路如下:
所有涉及基于纯代码原则
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拖控件两句话就可以搞定很方便。缺点就是比如下面的界面就不好控制了:
实现根据数据的不同,排列图片,以及对下面转发,评论,点赞工具条的设计,这个很明显把图片和工具条单独的功能繁多我们需要分开来写,这样就需要代码进行实现了(这个只是本人的思路),具体根据开发遇到的问题决定