iOS的cell行高自适应

1.预估cell高度

  • 为cell的子控件添加约束
  • 设置高度

有两种写法:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 100;

或者

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
   return 100;//随便写,但是越接近真实高度越好
}

http://www.jianshu.com/p/64f0e1557562
但是这个方法实际上在有多个子视图的cell上滑动是很卡顿的

2. 手动计算Cell的高度

高度固定的情况下直接设置

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   return 666;
}

或者高度固定的情况下直接

self.tableView.rowHeight = 666;

高度不定的需要提前拿到model中的数据来手动计算每个控件的高度(一般为文字类Label

iOS的cell行高自适应_第1张图片
屏幕快照 2017-09-11 下午6.15.19.png


手动计算高度的话,最开始都是根据cell内子控件内容的高度来手动累加起来,但是这个方法每次都要去手动处理其中的算高逻辑,而且横竖屏切换的时候还要重新计算

计算

如果cell中有配图,而且是有的cell有,有的cell没有。给配图控件添加约束时,高度不要写死,给一个占位约束。在设置数据时一定要注意,有配图就设置上; 没有配图,一定要把image重新写为nil。
在cell中设置最下方的底边约束

2.2.1 添加预估行高、自行计算行高

//预估行高
//自动计算行高
self.tableView.rowHeight = UITableVIewAutomaticDimension;

2.2.2 设置cell最下方的底边约束

//    设置contentView的底部约束
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
make.bottom.equalTo(moreBtn.mas_bottom).offset(10);
}];

2.2.3 占位约束

make.height.lessThanEqualTo(@150);

2.2.4 获取cell最底的控件的最大的Y

这里分成两种情况:
1,如果最下方的控件有多个,不太容易确定到底谁最下面。就要用代码一。
2,如果最下方的控件只有一个,可以直接确定最底部的控件,用代码二。

代码一:

   //    为了自动设置行高,就必须对从contentView的底边进行约束
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self);

        // 给底部添加了两个约束,谁更高就用谁
        make.bottom.greaterThanOrEqualTo(chatBackgroundView.mas_bottom).offset(8);
        make.bottom.greaterThanOrEqualTo(headshotView.mas_bottom).offset(8);
    }];
代码二:
self.frame = CGReckMake(0,0,CGRectGetMaxY(最底部的控件.frame));

缓存cell高度

高度计算出来后,但是如果这个高度值每次滑动的时候由于cell的复用机制都会重新计算,若果这个cell的自定义样式很复杂,子视图太多,那么大量的计算一定会损耗性能而导致明显的卡顿,所以缓存机制就是个必要的措施
http://www.jianshu.com/p/37d980974dbe

你可能感兴趣的:(iOS的cell行高自适应)