如果一切都是以编程方式创建的,而不使用故事板,如何以编程方式调整 TableView 中单元格的高度?

How to programmatically adjust the height of a cell in a TableView if everything is created programmatically, without using a storyboard?

我看过很多示例,但不知何故它们不起作用。 我的代码如下。 自定义单元格中的对象约束:

下面是class中的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    view.addSubview(tableView)
    tableView.separatorStyle = .none
    tableView.estimatedRowHeight = 200
}

//表格视图 ->

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 340
}

有几件事值得解决:

1。不要在 layoutSubviews()

中设置布局

每当对布局进行更改时,此方法将被多次触发,这意味着所有这些约束都将被复制,并最终会导致问题。尝试将它们设置在单元格的 init 中。

2。不执行 heightForRowAt

实现此功能时:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 340
}

你是在告诉 tableview 给单元格这个精确的大小。根据文档:

The value returned by this method takes precedence over the value in the rowHeight property.

删除此代码!

3。将 rowHeight 设置为自动大小值

您已经正确设置了 estimatedRowHeight 值,但我们还需要将 rowHeight 属性 设置为 UITableView.automaticDimension.

tableView.rowHeight = UITableView.automaticDimension

现在你应该可以开始了!

奖励:滚动性能改进

Table 视图将从有关单元格大小的任何其他信息中受益,如果您能够计算出比 [=21= 更好的近似值,则可以使用 estimatedHeightForRowAt 提供该信息] 您在初始设置中设置的值。

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    // return more accurate value here
}