iOS UITableView 解决估算行高和指定行高的矛盾
喜欢交朋友的加:微信号 dwjluck2013
1、一般来说 在iOS 中若UITableViewCell 固定行高, 会通过
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 81; }
来设置;
2、如果需要由系统自动估算行高, 可以通过设置以下代码实现:
// 动态行高 self.tableView.rowHeight = UITableViewAutomaticDimension; // 预估行高 self.tableView.estimatedRowHeight = 150;
3、如果一个tableview即想用固定行高又想用预估行高(自动计算行高) 这两者的矛盾怎样解决呢?以下代码 关键在于 这句话:
return UITableViewAutomaticDimension;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0 || indexPath.section == 1) { return 81; } // 注意:解决固定行高和系统自动计算行高 其他组走系统自动计算行高 return UITableViewAutomaticDimension; }
4.在cell中约束好之后 要写 self.contentView 的高度实际contentview的高度就是cell的高度 重点注意在cell中 子控件约束不能用
contentView 约束 因为在设置self.contentView约束之前 self.contentView的高度都是0;
例如:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self.selectionStyle = UITableViewCellSelectionStyleNone; self.separatorInset = UIEdgeInsetsZero; [self.contentView addSubview:self.headerImageView]; [self.contentView addSubview:self.titleLabel]; [self.contentView addSubview:self.detailLabel]; __weak typeof(self)weakself = self; [self.headerImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(weakself.mas_top).offset(10 / WIDTH_6S_SCALE); make.width.height.mas_offset(40 / WIDTH_6S_SCALE); make.left.equalTo(weakself.mas_left).offset(10 / WIDTH_6S_SCALE); }]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(weakself.headerImageView.mas_top); make.left.equalTo(weakself.headerImageView.mas_right).offset(15 / WIDTH_6S_SCALE); make.height.mas_offset(20 / HEIGHT_6S_SCALE); }]; [self.detailLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(weakself.titleLabel.mas_left); make.right.equalTo(weakself).offset(-10 / WIDTH_5S_SCALE); make.top.equalTo(weakself.titleLabel.mas_bottom).offset(5 / WIDTH_6S_SCALE); }]; [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(weakself.headerImageView.mas_top).offset(-10 / WIDTH_5S_SCALE); make.left.right.equalTo(weakself); make.bottom.equalTo(weakself.detailLabel.mas_bottom).offset(10 / WIDTH_5S_SCALE); }]; } return self; }