我們都知道UITableView從iOS 8開(kāi)始實(shí)現(xiàn)行高的自適應(yīng)相對(duì)比較簡(jiǎn)單,首先必須設(shè)置estimatedRowHeight給出預(yù)估高度,設(shè)置rowHeightUITableViewAutomaticDimension(注意:如果不修改rowHeight默認(rèn)就是UITableViewAutomaticDimension),對(duì)于這兩個(gè)參數(shù)除了直接修改tableview對(duì)應(yīng)的屬性之外仍然支持使用對(duì)應(yīng)的代理方法設(shè)置。最后只要在UITableViewCell中設(shè)置contentView的約束即可。由于UITableViewCell的寬度等同于UITableView因此約束的設(shè)置事實(shí)上只是為了自動(dòng)計(jì)算高度。通常的做法就是設(shè)置contentView的top和bottom約束,而后其內(nèi)部子視圖可以提供intrinsicContentSize(例如UIButtonUILabel默認(rèn)就已經(jīng)提供)或者已經(jīng)有明確的height約束。這樣一來(lái)就可以做到子控件確定了自身高度,而contentView子控件又設(shè)置了和contentView相關(guān)的bottom約束來(lái)反向計(jì)算出UITableViewCell的實(shí)際高度。
下面仍然以前面UITableView文章的自定義Cell舉例,相比之前大量的運(yùn)算而言Self-Sizing Cells可以說(shuō)簡(jiǎn)化了很多。除了設(shè)置estimatedRowHeight外最重要的就是添加相關(guān)Autolayout約束。由于頭像高度已經(jīng)固定,內(nèi)容高度可以通過(guò)固有高度自動(dòng)計(jì)算,而二者的間隔和top、bottom約束已經(jīng)固定,從而Self-Sizing Cells可以自動(dòng)計(jì)算出Cell的高度。
高度計(jì)算約束關(guān)系:
移動(dòng)開(kāi)發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)
Cell布局代碼:

    import UIKit    import SnapKit    
    class StatusTableViewCell: UITableViewCell {    
        // MARK: - 公共屬性
        var status:Status! {            didSet {                self.avatarImageView.image = UIImage(named: status.profileImageUrl)                self.userNameLabel.text = status.userName                self.mtypeImageView.image = UIImage(named: status.mbtype)                self.createdAtLabel.text = status.createdAt                self.sourceLabel.text = status.source      &n