废话不多说 直接上代码
- (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 进行刷新
上面两张图是验证了昨天的思路 先把所有条件集齐就可以计算出高度 (当然第三部可以省略 系统默认的有 在此写出来 只为验证用)
网友评论