UIStackView 布局边距内的 UITableView

UITableView inside UIStackView layout margins

我目前有一个 UITableView 嵌入在 UIStackView 中。我目前已将 StackView 设置为具有自己的填充,如下所示:

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)
stackView.isLayoutMarginsRelativeArrangement = true

我还把stackview设置在它的边缘,它也在scrollview下面。

但是,应用这些设置时,我在 UITableView 约束上遇到错误,告诉我布局边距约束是问题所在。

(
    "<NSLayoutConstraint:0x600000645f90 UIStackView:0x7fa9bbc32260.width == UIScrollView:0x7fa9bc019800.width   (active)>",
    "<NSLayoutConstraint:0x6000006441e0 H:|-(0)-[UIScrollView:0x7fa9bc019800](LTR)   (active, names: '|':COVID_19_Compliance_Coach.DashboardView:0x7fa9bbc11340 )>",
    "<NSLayoutConstraint:0x600000644320 UIScrollView:0x7fa9bc019800.right == COVID_19_Compliance_Coach.DashboardView:0x7fa9bbc11340.right   (active)>",
    "<NSLayoutConstraint:0x600000646f30 '_UITemporaryLayoutWidth' COVID_19_Compliance_Coach.DashboardView:0x7fa9bbc11340.width == 0   (active)>",
    "<NSLayoutConstraint:0x600000647250 'UISV-canvas-connection' UILayoutGuide:0x600001c76a00'UIViewLayoutMarginsGuide'.leading == UITableView:0x7fa9bc0a2e00.leading   (active)>",
    "<NSLayoutConstraint:0x6000006472f0 'UISV-canvas-connection' UILayoutGuide:0x600001c76a00'UIViewLayoutMarginsGuide'.trailing == UITableView:0x7fa9bc0a2e00.trailing   (active)>",
    "<NSLayoutConstraint:0x6000006470c0 'UIView-leftMargin-guide-constraint' H:|-(8)-[UILayoutGuide:0x600001c76a00'UIViewLayoutMarginsGuide'](LTR)   (active, names: '|':UIStackView:0x7fa9bbc32260 )>",
    "<NSLayoutConstraint:0x600000647160 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x600001c76a00'UIViewLayoutMarginsGuide']-(8)-|(LTR)   (active, names: '|':UIStackView:0x7fa9bbc32260 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000006472f0 'UISV-canvas-connection' UILayoutGuide:0x600001c76a00'UIViewLayoutMarginsGuide'.trailing == UITableView:0x7fa9bc0a2e00.trailing   (active)>

我似乎无法弄清楚错误是什么。如果有人能给我指出正确的方向,那将非常有帮助,或者如果有不同的方法,那也会有帮助。

这里还有一个关于视图层次结构的指南:

UIScrollView
 -> UIStackView
     -> UITableView

我强烈建议您不要在滚动视图中添加 table 视图,因为 table 视图已经有滚动视图。

也就是说我会这样添加约束

  1. 滚动视图:

    • 将它固定到超级视图的所有角落
  2. 堆栈视图:

    • 将其固定到滚动视图的四个角
    • 创建一个等于滚动视图高度的高度约束
    • 创建等于滚动视图宽度的宽度约束
  3. Table 查看

    • 将 table 视图添加到堆栈视图

如果需要向 table 视图添加高度约束,则需要删除堆栈视图的高度约束

如果您向堆栈视图添加其他视图,您还需要向它们添加高度限制

我意识到我在应该如何实施设计方面想得太多了。我删除了 UIStackView,并将其替换为 UITableView 作为根。

所以现在层次结构更多:

UITableView
 -> SectionHeaderView 
 -> CustomCells (dequeuedReusable)

我决定将这些额外的视图放在顶部的 header 部分视图中,然后改用单元格。谢谢你们的建议和更清晰的方法。非常感谢。