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

时间:2019-04-03 18:11:53

标签: ios swift uitableview autolayout

我有一个情节提要,其中的视图层次很简单:

- 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和父View随着新记录的添加而增长。但是,相对于安全区域,父视图不应超出其顶部/底部约束。

除表格视图(高度> = 0)外,所有元素都具有明确设置的高度限制和间距。同样,父级的视图内容优先级为250,而tableview的压缩阻力为750。我认为固定高度限制和元素之间的间距将使tableview增长到某个点,因为顶部的内容压缩阻力较高/ bottom安全区域限制要比TableView要大。

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

我宁愿坚持使用AutoLayout,并想知道是否有人对如何执行此操作有想法或资源。

1 个答案:

答案 0 :(得分:1)

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

您可以使用此自定义表格视图类(来自https://stackoverflow.com/a/48623673/6257435):

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

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

每当内容大小更改时,它将“自动调整大小”您的表视图。要使用它,请添加一个表视图并将其类设置为ContentSizedTableView

  • 根据需要约束顶部,前导和尾随。
  • 将底部限制为超级视图的底部>= 0(如果您希望其从底部停止8点,或者将布局的值设为>= 8,则限制为100
  • 赋予高度限制-并不重要,但是使用ContentSizedTableView之类的值时,您可以在处理布局时看到它。
  • 然后 编辑该高度约束 ,并选中占位符-在构建时删除复选框。

运行应用程序时,表格视图的高度约束将被删除,abc将自动增长,直到达到底部约束为止。