UITableView 高度等于 contentSize 高度

UITableView height equal to contentSize height

我有一个滚动视图,里面有一对标签和一个 tableView。我希望该 tableView 由外部 scrollView 而不是 tableView 的 scrollView 滚动,所以我所做的是将 tableView 高度的约束设置为等于 contentSize 高度。但是我有这个问题,只有当推送动画完成时它的大小才正确(我猜 viewDidLayoutSubviews 被调用)

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    tableHeightConstraint?.constant = tableViewController.tableView.contentSize.height
}

Video Link

内容大小将使用滚动视图逻辑进行刷新。所以布局子视图肯定是不够的。我有一种情况,我根据内容调整 table 视图的大小。我所做的是使用固有大小(这是情节提要中的压缩优先级)。我将 table 视图子类化并覆盖这些:

override var contentSize:CGSize {
    didSet {
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    self.layoutIfNeeded()
    return CGSize(width: UIViewNoIntrinsicMetric, height: contentSize.height)
}

剩下的可以在约束条件下完成。我的情况是我不会进一步调整它的大小,然后它是超级视图,但你做你必须做的。这里仍然要小心一点:如果这不受限制,你会破坏 table 视图出列功能,并且所有单元格可能会立即加载,这可能会消耗内存负载和 CPU。如果可能的话,我会避免这种情况。如果没有,下一个最好的办法是在滚动视图上使用垂直堆栈视图,这应该会产生您似乎期望的相同结果。