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;
}

原文地址:https://www.cnblogs.com/dujiahong/p/7728141.html