這都2017年了還在用frame布局實在是有點low了显熏。。谜疤。
Autolayout自iOS6開始引入佃延,到現(xiàn)在基本上也沒什么坑了,就算有夷磕,前輩們也都填好了( ??? .? ??? )?
自動計算cell高度
我理解的自動計算cell高度履肃,有兩個注意點:
第一: 設(shè)置tableView.estimatedRowHeight
self.tableView.estimatedRowHeight = 20
第二: 設(shè)置約束,保證cell的contentView的高度可以根據(jù)子控件算出來
例如以下只有一個label填充的cell(cell的結(jié)構(gòu)->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就可以自動計算自己的高度
實現(xiàn)cell的折疊和展開
先說我覺的比較好的實現(xiàn)方法:上面約束不用變改變Label的numberOfLines就可以坐桩,需要展開的時候設(shè)置為0尺棋,折疊的時候設(shè)置為3。
下面的是我的想法過程,大家可以略過:
一開始的時候想的是給label一個高度小于等于120的約束膘螟,并且持有它
make.height.lessThanOrEqualTo(@120)
折疊的時候成福,把約束install,展開的時候uninstall荆残。
實現(xiàn)起來:每次在TableView的cell點擊代理方法里面 調(diào)用cell的方法使label高度的約束install和uninstall奴艾,然后調(diào)用[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
后來發(fā)現(xiàn)和這個約束有沖突
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20)
,作為強迫癥患者這能忍内斯?蕴潦。
然后突然想到label的numberOfLines可以限制行數(shù)......這不就是現(xiàn)成的實現(xiàn)折疊/展開的最好方法嗎...
效果:
Demo :
文章參考 :
1.Masonry
2.優(yōu)化UITableViewCell高度計算的那些事
3.iOS7和iOS8下的自適應(yīng)cell