這都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的折疊和展開
先說我覺的比較好的實現方法:上面約束不用變改變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可以限制行數......這不就是現成的實現折疊/展開的最好方法嗎...