具有动态 tableView 高度的模糊布局

Ambiguous layout with dynamic tableView height

我有一个 viewController,我想在里面放两个 1 个 tableView 和 1 个 childViewController。

我的限制是:

NSLayoutConstraint.activate([
   tableView.topAnchor.constraint(equalTo: view.topAnchor),
   tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
   tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
   tableView.bottomAnchor.constraint(equalTo: artistVC.view.topAnchor),

])

NSLayoutConstraint.activate([
   artistVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
   artistVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
   artistVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

当我这样设置时,屏幕上只显示 childVC。我没有看到 tableView。 我想让 tableView 可以根据需要展开,然后让 childVC 滚动到底部。

但是我无法自己设置高度,因为我不知道 tableViewCell 的高度是多少..

有什么建议吗?我试过更改内容拥抱和内容压缩阻力,但我在那里没有找到任何运气。

Table 视图和其他可滚动视图没有 intrinsicContentSize。例如,如果参与视图是 UIImageViewUILabel 两者都可以根据其内容调整大小,那么您的约束会很好,但是因为您的视图是 UITableViewUIView(虽然您对 UIView 有足够的限制,不会产生歧义,但它们都不能自动调整自己的大小)您需要自己调整大小。

要获得您想要的行为,您需要 subclass UITableView 并覆盖 intrinsicContentSize,或者您需要设置高度限制。无论哪种方式,您都需要自己计算正确的高度。内容拥抱和抗压缩性允许自动布局在竞争之间进行裁定 intrinsicContentSizes,因此他们在这种情况下没有帮助。

例如:

final class SizingTableView: UITableView {
    override var intrinsicContentSize: CGSize {
        return CGSize(width: bounds.width, height: <# Some appropriate height #>)
    }
}

然后在故事板或 xib 中将 table 视图的 class 更改为 SizingTableView 并且您可以为 [=] 的固有内容大小设置设计时占位符31=] 查看尺寸检查以解决任何警告我们的错误。

我建议像这样子classing UITableView:

class AutomaticHeightTableView: UITableView {

  override var intrinsicContentSize: CGSize {
    return contentSize
  }

  override func reloadData() {
    super.reloadData()
    invalidateIntrinsicContentSize()
  }
}

然后在 Interface Builder 中将 AutomaticHeightTableView 设置为 table 视图的 class,table 将尝试调整自身大小以适应内容。它将遵循您设置的任何其他约束,因此请确保约束允许它自由增长。