Masonry自適應cell高度,同時實現cell折疊和展開

這都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可以限制行數......這不就是現成的實現折疊/展開的最好方法嗎...

效果:
可以折疊的cell的效果圖
Demo :

test-autolayoutcell

文章參考 :

1.Masonry
2.優化UITableViewCell高度計算的那些事
3.iOS7和iOS8下的自適應cell

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容