我可以给你一个可以解决你问题的例子。我使用 SnapKit https://github.com/SnapKit/SnapKit 来更新 UIView 的约束。这是UIViewController 的示例,您希望在其中显示您的表格:
class ViewController: UIViewController {
private var tableView : UITableView = {
let tabView = UITableView.init(frame: CGRect.zero)
tabView.register(TableViewCell.self, forCellReuseIdentifier: "cell")
return tabView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.dataSource = self
self.tableView.delegate = self
self.view.addSubview(self.tableView)
}
override func updateViewConstraints() {
self.tableView.snp.remakeConstraints { (maker) in
maker.edges.equalTo(self.view) // your table will have the same frame as your view
}
super.updateViewConstraints()
}
}
在第一个扩展中,我们将把UITableViewDelegate的所有方法:
extension ViewController : UITableViewDelegate {
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 200.0 // any value different from zero. 200 is an example. This value must be easy-to-calculate.
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension // tells system that rows will be resized automatically
}
}
在第二个扩展中有UITableViewDataSource的方法(只是生成一些随机数据):
extension ViewController : UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.setup(labelText: "Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label ", textViewText: "Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text ")
return cell
}
}
以及包含UILabel 和UITextView 的单元格类:
class TableViewCell: UITableViewCell {
private var label : UILabel = {
let resultLabel = UILabel.init(frame: CGRect.zero)
resultLabel.numberOfLines = 0 // If numberOfLines in 0 system will automatically set real number of lines
return resultLabel
}()
private var textView : UITextView = {
let resultTextView = UITextView.init(frame: CGRect.zero)
resultTextView.isScrollEnabled = false // disable scroll and editing just for example
resultTextView.isEditable = false
return resultTextView
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.contentView.addSubview(self.label)
self.contentView.addSubview(self.textView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup(labelText:String, textViewText:String) {
self.label.text = labelText
self.textView.text = textViewText
self.setNeedsUpdateConstraints()
}
override func updateConstraints() {
self.label.snp.remakeConstraints { (maker) in
maker.left.equalTo(self.contentView.snp.left)
maker.right.equalTo(self.contentView.snp.right)
maker.top.equalTo(self.contentView.snp.top)
maker.bottom.equalTo(self.textView.snp.top)
}
self.textView.snp.remakeConstraints { (maker) in
maker.left.equalTo(self.contentView.snp.left)
maker.right.equalTo(self.contentView.snp.right)
maker.bottom.equalTo(self.contentView.snp.bottom)
}
super.updateConstraints()
}
}