UITableview的行高处理优化,先设置好预估行高,这样系统的执行顺序便是,先创建cell
,然后执行代理行高,返回对应cell的高度。
如果没有设置预估行高
,执行顺序是先代理行高,再创建cell。
#pragma mark - <UITableViewDelegate>
//self.tabview.estimatedHeightForRowAtIndexPath = 200;同代理方法一个效果
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 200;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
DZMessage *message = self.messages[indexPath.row];
return message.cellHeight;
}
cell行高的返回,以及不定行高的约束的更新。
- (void)setMessage:(DZMessage *)message
{
_message = message;
// 时间处理
if (message.hideTime) { // 隐藏时间
self.timeLabel.hidden = YES;
[self.timeLabel updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(0);
}];
} else { // 显示时间
self.timeLabel.text = message.time;
self.timeLabel.hidden = NO;
[self.timeLabel updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(21);
}];
}
// 处理显示的消息文字
// 设置按钮的文字
[self.textButton setTitle:self.message.text forState:UIControlStateNormal];
// 强制更新
[self layoutIfNeeded];
// 设置按钮的高度就是titleLabel的高度
[self.textButton updateConstraints:^(MASConstraintMaker *make) {
CGFloat buttonH = self.textButton.titleLabel.frame.size.height + 30;
make.height.equalTo(buttonH);
}];
// 强制更新
[self layoutIfNeeded];
// 计算当前cell的高度
CGFloat buttonMaxY = CGRectGetMaxY(self.textButton.frame);
CGFloat iconMaxY = CGRectGetMaxY(self.iconView.frame);
self.message.cellHeight = MAX(buttonMaxY, iconMaxY) + 10;
}