SnapKit - UITableView 高度不随单元格的动态内容而变化

SnapKit - UITableView height is not change with dynamical content of cell

我是SnapKit初学者,想用SnapKit实现一个UITableViewController,每一行有两个UILabel,一个是Title,另一个是Value。 我的问题是 UITableView 中行的高度没有根据每行的内容而改变。 这是我的代码:

class ViewController:

import UIKit
import SnapKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

// MARK: Property List
var list: NSMutableArray?
let myTableView: UITableView = {
   let table = UITableView()
    return table
}()

//MARK: Life Cycle
override func viewDidLoad() {
    super.viewDidLoad()
    self.myTableView.rowHeight = UITableView.automaticDimension
    self.myTableView.estimatedRowHeight = 100
    title = "TableView Page"
    setup()
    setupViews()

}

// MAKR: Setup View
func setup() {
    self.view.backgroundColor = .white
    navigationController?.navigationBar.prefersLargeTitles = true
}

func setupViews () {
    self.view.addSubview(myTableView)
    myTableView.snp.makeConstraints { make in
        make.top.left.bottom.right.equalTo(10)
    }
    myTableView.register(CustomCell.self, forCellReuseIdentifier: CustomCell.customCell)
    myTableView.delegate = self
    myTableView.dataSource = self
}

// MARK: TableView DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: CustomCell.customCell, for: indexPath) as! CustomCell
    cell.title.text = "title is lognest??"
    cell.value.text = (indexPath.row % 2 == 0) ?
     "longest value longest value longest value longest value longest value longest value longest value for text"
        : "short value"
    cell.title.snp.makeConstraints { (make) in
        make.top.equalTo(cell.value.snp.top)
        make.left.equalTo(20)
        make.trailing.equalTo(cell.value.snp.leading)
    }
    cell.value.snp.makeConstraints { (make) in
        make.right.equalTo(-20)
        make.top.equalTo(cell.title.snp.top)
        make.bottom.equalTo(-10)
    }

    NSLog("value height is: \(cell.value.frame.height)")
    NSLog("cell height is: \(cell.frame.height)")
        return cell;
    }    
}

class 自定义单元格:

// MARK: custom cell
class CustomCell: UITableViewCell {

// MARK: Property
static var customCell = "cell"
public var title:UILabel = {
    let tit = UILabel()
    tit.setContentHuggingPriority(.defaultLow, for: .horizontal)
    tit.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
    tit.textColor = .black
    tit.alpha = 0.6
    return tit
}()
public var value:UILabel = {
    let val = UILabel()
    val.textColor = .black
    val.setContentHuggingPriority(.defaultHigh, for: .horizontal)
    val.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    val.lineBreakMode = NSLineBreakMode.byWordWrapping
    val.numberOfLines = 0
    val.alpha = 0.75
    return val
}()

// MARK: initializer
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.addSubview(title)
        self.addSubview(value)
}

    required init?(coder aDecoder: NSCoder) {
        fatalError("init?(coder aDecoder: NSCoder)")
    }
}

这是控制台日志:

snapkitTest[26345:1387159] cell height is: 44.0
snapkitTest[26345:1387159] value height is: 0.0

1- 您必须将标签添加到

self.contentView.addSubview(title)

2- 您需要将底部约束设置为 contentView

title.snp.makeConstraints { (make) -> Void in
        make.trailing.equalTo(value.snp.leading)
        make.top.equalTo(self.contentView.snp.top).inset(10)
        make.left.equalTo(20)
    }
value.snp.makeConstraints { (make) -> Void in
        make.right.equalTo(-40)
        make.top.equalTo(self.contentView.snp.top).inset(10)
        make.bottom.equalTo(-10)
    }

同时将此约束转移到 cell custom class 的初始化,以免在每次滚动 tableView

时重新添加约束