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