自动布局 UITableView 扩展父视图但不大于安全区域

Autolayout UITableView expand parent view but not greater than safe area

我有一个具有简单视图层次结构的故事板:

- View (has top/bottom constraints relative to safeArea >= 30, centerY)
   - Label (has height/top(SuperView)/bottom(TextField) constraints)
   - TextField (has height/top(Label)/bottom(TableView) constraints)
   - TableView (has height >= 0, top(TextField)/bottom(Superview) constraints)

在 UITableViewDelegate (cellForRowAt) 内部:

tableView.setNeedsLayout()
tableView.layoutIfNeeded()

我希望实现的行为是让 TableView 和父视图随着新记录的添加而增长。但是,父视图不应超出其相对于安全区域的 top/bottom 约束。

除了 table 视图(高度 >= 0)之外,所有元素都明确设置了高度限制和间距。同样,父视图内容拥抱优先级为 250,table 视图压缩阻力为 750。我认为修复高度限制和元素之间的间距将使 table 视图增长到某个点因为 top/bottom 安全区域约束的内容压缩阻力高于 TableView。

但是,XCode 迫使我为父视图设置高度或 Y 位置约束。我不能那样做,因为这样视图就不能自动增长。

我更愿意坚持使用 AutoLayout,想知道是否有人有关于如何执行此操作的想法或资源。

Table 视图不会根据行数自动设置高度。

您可以使用此自定义 table 视图 class(来自 ):

final class ContentSizedTableView: UITableView {
    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

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

每当内容大小发生变化时,这将 "auto-size" 您的 table 视图。要使用它,请添加一个 table 视图并将其 class 设置为 ContentSizedTableView

  • 根据需要限制顶部、前导和尾随。
  • 将底部限制为 >= 0 到超级视图的底部(或者 >= 8 如果你想让它从底部停止 8 磅,或者你想要的布局值)。
  • 给它一个高度限制 - 并不重要,但是使用 100 这样的值让你在使用布局时看到它。
  • 然后编辑高度约束并选中占位符 - 在构建时删除复选框.

当您 运行 应用程序时,table 视图的高度限制将被移除,ContentSizedTableView 将自动增长直到达到底部限制。