我們都知道UITableView從iOS 8開(kāi)始實(shí)現(xiàn)行高的自適應(yīng)相對(duì)比較簡(jiǎn)單,首先必須設(shè)置estimatedRowHeight給出預(yù)估高度,設(shè)置rowHeight為UITableViewAutomaticDimension(注意:如果不修改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)系:
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