iOS开发masonry动态布局cell高度

说到iOS自动布局,有很多的解决办法。有的人使用xib/storyboard自动布局,也有人使用frame来适配。对于前者,笔者并不喜欢,也不支持。对于后者,更是麻烦,到处计算高度、宽度等,千万大量代码的冗余,对维护和开发的效率都很低。

笔者在这里介绍纯代码自动布局的第三方库:Masonry。这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的。

本文Cell内容通过Masonry自动布局并且cell巧妙利用自动布局计算cell动态高度

实现思路:例如cell中有 label1,label2,label3。

1、为label1添加约束 (以cell.contentView为基准)

    CGFloat one_W = SCREENWIDTH/2;

    [self.L1makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(16);

        make.top.mas_equalTo (10);

        make.width.mas_lessThanOrEqualTo(one_W);e_W);

    }];

2、为label2添加约束 使其在label1下方距离为5处 (以label1为基准)。

    [self.L2makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(wself.L1.mas_left);

        make.top.equalTo(wself.L1.mas_bottom).offset(5);

        make.width.mas_lessThanOrEqualTo(one_W);

    }];

3、为label3添加约束 使其在label2 下方距离为5处 (以label2为基准,重点在于这个一定要在label3 添加一个距离cell。contentView底部的约束)。以上完成cell 子视图的约束。

    [self.L3 makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(wself.L1.mas_left);

        make.top.equalTo(wself.L2.mas_bottom).offset(5);

        make.width.mas_lessThanOrEqualTo(SCREENWIDTH-32);

        make.bottom.equalTo(wself.contentView.mas_bottom).offset(-10);

    }];


4、在tableView heightForRowAtIndexPath 代理中使用一个单独的不显示在屏幕的cell 作为计算cell高度使用,通过下面代码获取cell高度:

    customCell *cell= [customCellshareInstance];  

    //返回cell之前重新刷新约束,重新计算高度

    [cell setNeedsUpdateConstraints];

    [cell updateConstraintsIfNeeded];


    [cell setCellContent:self.data[indexPath.row]];

    [cell setNeedsLayout];

    [cell layoutIfNeeded];


    CGFloat height = [cell.contentViewsystemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    return height;


本文demo。



你可能感兴趣的:(iOS,开发)