传统意义上设置tableView的行高一共有四种方法。等等,标题不是说有五种方法嘛。别着急,咱们先看四种最基本的方法,最后再说第五种自动计算行高的方法。
代理方法调用频率非常的原因是想算contentSize,(UITableView是UIScrollView的子,所以继承了UIScrollView的属性)。如果不知道每一行的行高,就没有办法计算出contentSize.
代理方法如下:
//这里我们让偶数行行高为50,奇数行为100
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row % 2 == 0) {
return 50;
}
return 100;
}
设置预估行高:
- (void)viewDidLoad {
[super viewDidLoad];
// 预估行高
self.tableView.estimatedRowHeight = 200;
}
viewDidLoad
中设置- (void)viewDidLoad {
[super viewDidLoad];
// 设置行高
self.tableView.rowHeight = 10;
}
Paste_Image.png
Paste_Image.png
说明: 此处也不能算是严格意义上的优先等级。
终于来了第五种方法,这里设置约束的时候用到Masonry的第三方框架。木有用过的童鞋可以从文章下方看到之前的分享链接了解。
在实际开发中,很少有写死cell高度的。因为每个cell的内容不太一样,不太可能都保持统一的高度。当然有处女情结的产品经理手头出来的项目例外,哈哈~
//预估行高
//自动计算行高
self.tableView.rowHeight = UITableVIewAutomaticDimension;
// 设置contentView的底部约束
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
make.bottom.equalTo(moreBtn.mas_bottom).offset(DEFAULT_MARGIN);
}];
make.height.lessThanEqualTo(@150);
}];
这里分成两种情况: 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行高了。 自动行高的demo在这里:戳我戳我
写完demo上传了之后才发现,没写注释。。。如果有看不懂的童鞋留言哈,我再补充一下注释。
特别感谢@缘之有缘的评论哦。
之所以说是第五种,是因为基本的设置其实就依然还是4种方法,根据基本的方法可以延伸出来第六种、第七种、第八种。。。