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
,
)
手动计算高度的话,最开始都是根据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