UITableViewCell高度自适应 使用Masonry纯代码约束

大部分情况下公司要求纯代码布局, 下面介绍纯代码UITableViewCell高度自适应, 不用去计算每个控件的高度然后相加. 纯代码布局一般会用到 Masonry.

UITableViewCell高度自适应 使用Masonry纯代码约束_第1张图片
效果图

AutoTabelViewCell 所有代码
注意:
AutoLayout约束最好不要写浮点数值, 例如 make.top.equalTo(self.contentView).offset(5.666); 可能会计算不准确, 而且可能会报约束冲突!

@interface AutoTabelViewCell : UITableViewCell

@property (nonatomic,strong) UILabel *contentLabel;
@property (nonatomic,strong) UIImageView *headerImage;

@end

@implementation AutoTabelViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        self.backgroundColor = RandColor;

        _contentLabel = [[UILabel alloc] init];
        _contentLabel.font = [UIFont systemFontOfSize:15];
        _contentLabel.numberOfLines = 0;
        [self.contentView addSubview:_contentLabel];
        
        _headerImage = [[UIImageView alloc] init];
        _headerImage.backgroundColor = RandColor;
        _headerImage.layer.cornerRadius = 25;
        [self.contentView addSubview:_headerImage];
        
        
        // 约束可以直接放在创建的地方
        // 不要放在layoutSubviews 或 updateConstraints方法里
        [_headerImage mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.contentView).offset(10);
            make.top.equalTo(self.contentView).offset(20);
            make.height.width.equalTo(@50);
        }];
        
        [_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(_headerImage.mas_bottom).offset(5);
            make.left.right.equalTo(self.contentView);
            
            // 这一步是关键 让cell知道最底部在哪儿, 然后算出自身高度
            make.bottom.equalTo(self.contentView);
        }];
        
        // 约束更新 时调用updateConstraints方法  不需可以不写
        [self setNeedsUpdateConstraints];
    }
    return self;
}

// 告诉系统使用AutoLayout 其实写不写都行
+ (BOOL)requiresConstraintBasedLayout {
    return YES;
}

// AutoLayout 更新约束
- (void)updateConstraints {
    [super updateConstraints];
}

// 官方文档介绍: Masonry约束不能放在这里
- (void)layoutSubviews {
    [super layoutSubviews];
}

@end

TableViewAutoVC 控制器里所有代码

@interface TableViewAutoVC ()

@property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *dataArray;

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    [self.view addSubview:self.tableView];
}

- (UITableView *)tableView{
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeigth) style:UITableViewStylePlain];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        // 设置预估高度
        _tableView.estimatedRowHeight = 50;
        _tableView.rowHeight = UITableViewAutomaticDimension;
        [_tableView registerClass:[AutoTabelViewCell class] forCellReuseIdentifier:NSStringFromClass([AutoTabelViewCell class])];
    }
    return _tableView;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    AutoTabelViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([AutoTabelViewCell class]) forIndexPath:indexPath];
    cell.contentLabel.text = self.dataArray[indexPath.row];
    return cell;
}

// 此方法就不用实现了
//- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
//    return 10;
//}

// 数据
- (NSMutableArray *)dataArray{
    if (!_dataArray) {
        _dataArray = [NSMutableArray arrayWithObjects:
                      @"A view that presents data using rows arranged in a single column.",
                      @"A table view displays a list of items in a single column. UITableView is a subclass of UIScrollView, which allows users to scroll through the table, although UITableView allows vertical scrolling only. The cells comprising the individual items of the table are UITableViewCell objects; UITableView uses these objects to draw the visible rows of the table. ",
                      @"Cells have content—titles and images—and can have, near the right edge, accessory views. Standard accessory views are disclosure ",
                      @"A table view displays a list of items in a single column. UITableView is a subclass of UIScrollView, which allows users to scroll through the table, although UITableView allows vertical scrolling only. The cells comprising the individual items of the table are UITableViewCell objects; UITableView uses these objects to draw the visible rows of the table. Cells have content—titles and images—and can have, near the right edge, accessory views. Standard accessory views are disclosure indicators or detail disclosure buttons; the former leads to the next level in a data hierarchy and the latter leads to a detailed view of a selected ",
                      @"Table views can have one of two styles",
                      @"Many methods of UITableView take NSIndexPath objects as parameters and return values. UITableView declares a category on NSIndexPath that enables you to get the represented row index (row property) and section index (section property), and to construct an index path from a given row index and section index ", nil];
        
    }
    return _dataArray;
}

@end

都撸到这里了, 还不给个 !

你可能感兴趣的:(UITableViewCell高度自适应 使用Masonry纯代码约束)