这都2017年了还在用frame布局实在是有点low了。。。
Autolayout自iOS6开始引入,到现在基本上也没什么坑了,就算有,前辈们也都填好了( ⁼̴̀ .̫ ⁼̴́ )✧
自动计算cell高度
我理解的自动计算cell高度,有两个注意点:
第一: 设置tableView.estimatedRowHeight
self.tableView.estimatedRowHeight = 20
第二: 设置约束,保证cell的contentView的高度可以根据子控件算出来
例如以下只有一个label填充的cell(cell的结构->cell--contentView--label)
只需要给label添加以下约束:
// 布局
[_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(_contentLabel.superview.mas_left).with.offset(20);
make.top.equalTo(_contentLabel.superview.mas_top).with.offset(20);
make.right.equalTo(_contentLabel.superview.mas_right).with.offset(-20);
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20);
}];
cell就可以自动计算自己的高度
内容高度不固定的cell实现cell的折叠和展开
先说我觉的比较好的实现方法:上面约束不用变改变Label的numberOfLines就可以,需要展开的时候设置为0,折叠的时候设置为3。
下面的是我的想法过程,大家可以略过:
一开始的时候想的是给label一个高度小于等于120的约束,并且持有它
make.height.lessThanOrEqualTo(@120)
折叠的时候,把约束install,展开的时候uninstall。
实现起来:每次在TableView的cell点击代理方法里面 调用cell的方法使label高度的约束install和uninstall,然后调用[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
后来发现和这个约束有冲突
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20)
,作为强迫症患者这能忍?。
然后突然想到label的numberOfLines可以限制行数......这不就是现成的实现折叠/展开的最好方法吗...
网友评论
make.left.equalTo(_contentLabel.superview.mas_left).with.offset(20);
make.top.equalTo(_contentLabel.superview.mas_top).with.offset(20);
make.right.equalTo(_contentLabel.superview.mas_right).with.offset(-20);
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20);
}];
有demo吗?我就不知道这段代码怎么实现cell的高度自适应。
计算cell高度的代码是什么?
我做cell自适应高度的时候总是得先计算出cell上label的高度(动态高度)然后再去计算cell的高度