Masonry Cell自适应 采坑经历

2020-01-21  本文已影响0人  柱000000001

废话不多说 直接上代码

- (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 进行刷新

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

猜你喜欢

热点阅读