美文网首页
Masonry Cell自适应 采坑经历

Masonry Cell自适应 采坑经历

作者: 柱000000001 | 来源:发表于2020-01-21 17:48 被阅读0次

    废话不多说 直接上代码

    - (UITableView *)tableVeiw

    {

        if (!_tableVeiw)

        {

            UITableView * tableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];

            tableView.backgroundColor = [UIColor cyanColor];

            tableView.dataSource = self;

            tableView.delegate = self;

            tableView.rowHeight = UITableViewAutomaticDimension;

            tableView.estimatedRowHeight = 50;

            [self.view addSubview:tableView];

            _tableVeiw = tableView;

        }

        return _tableVeiw;

    }

    tableview设置好后       heightForRow代理不要写

    接下来是cell的坑

    - (UILabel *)nameLabel

    {

        if (!_nameLabel)

        {

            UILabel * nameLabel = [[UILabel alloc]init];

            nameLabel.font = [UIFont systemFontOfSize:20];

            nameLabel.numberOfLines = 0;

            nameLabel.lineBreakMode = NSLineBreakByWordWrapping;

            [self.contentView addSubview:nameLabel];

            _nameLabel = nameLabel;

        }

        return _nameLabel;

    }

    - (void)setUpSubViewsConstrains

    {

        [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {

            make.left.mas_equalTo(self.contentView.mas_left).mas_offset(5);

            make.top.mas_equalTo(self.contentView.mas_top).mas_offset(5);

            make.right.mas_equalTo(self.contentView.mas_right).mas_offset(-5);

            make.bottom.mas_equalTo(self.contentView.mas_bottom).offset(-5);

            make.height.mas_greaterThanOrEqualTo(30);

        }];

    }

    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    {

        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

        if (self)

        {

            [self setUpSubViewsConstrains];

        }

        return self;

    }

    - (void)setModel:(Model *)model

    {

        if (_model != model)

        {

            _model = model;

        }

        [self setNeedsLayout];

    }

    - (void)layoutSubviews

    {

        [super layoutSubviews];

        self.nameLabel.text = self.model.name;

    }

    以上写法的是按照frame时代遗留的习惯写出来的代码 始终运行不出来自适应的图

    如下图所示

    找了一天的原因 运行了无数的github的demo 始终不得要领 突然灵机一动 改动一行代码 运行出来了 代码如下:

    - (void)setModel:(Model *)model

    {

        if (_model != model)

        {

            _model = model;

            self.nameLabel.text = self.model.name;

        }

    }

    只是要将设置数据源的这段代码放入setModel方法中 

    如下图所示:

    终于成功了 日日日!!!

    后续会补充原理。。未完待续

    查阅一些文章后大概得出结论

    如果给label赋值放在 laysubviews方法中只是触发子图刷新 却不能改变cell的高度刷新 因为改变时机晚了。在用estimateheight估算高度的时候没有满足所有的布局条件(在这里指label没有内容值无法计算 所以用了估算的高度44)写在layoutsubviews中的话 用在之前的强制计算高度的时候是没有问题的 因为以前的方法(设置高度的方法)系统已经通过已知的高度强制撑开了cell。

    所以在自适应cell高度中 我们要提前把所有的条件交给系统让它计算高度 在给label赋值的时候 这是进行估算高度 所有条件都满足 顺利计算出label高度 加上约束的条件 系统就知道了cell高度 并且在label高度改变的时候会自动调用layoutsubviews 进行刷新

    上面两张图是验证了昨天的思路 先把所有条件集齐就可以计算出高度  (当然第三部可以省略 系统默认的有 在此写出来 只为验证用)

    相关文章

      网友评论

          本文标题:Masonry Cell自适应 采坑经历

          本文链接:https://www.haomeiwen.com/subject/lsbezctx.html