【问题标题】:UITableView inside UIStackView layout marginsUIStackView 内的 UITableView 布局边距
【发布时间】:2020-06-23 01:54:23
【问题描述】:

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

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

我还将stackview设置在其边缘,并且它也在滚动视图下。

但是,应用这些设置时,我在 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

【问题讨论】:

  • UITableview 是 UIScrollview 的子类,为什么在滚动视图中使用 tableview?它会产生滚动问题,您可以仅使用 tableview 实现相同的布局
  • 我目前在堆栈视图旁边附加了 3-4 个其他视图。我最初认为它不需要单独的单元格。那是首选方法吗?

标签: ios swift uitableview uistackview


【解决方案1】:

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

话虽如此,我会以这种方式添加约束

  1. 滚动视图:

    • 将其固定到超级视图的各个角落
  2. 堆栈视图:

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

    • 将表格视图添加到堆栈视图中

如果需要给table view添加高度约束,需要去掉stack view的高度约束

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

【讨论】:

  • 我目前在堆栈视图中有 2-3 个额外的视图。我最初打算将这些视图用作自定义单元格,但我认为这没有必要。我现在拥有的表格视图用于从 API 调用中加载项目列表。我应该选择自定义表格视图设计吗?
  • 您仍然可以保留滚动视图、堆栈视图、表格视图的方法,但我会探索使用包含多个部分的表格视图构建所有内容的可能性
【解决方案2】:

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

所以现在层次结构更多了:

UITableView
 -> SectionHeaderView 
 -> CustomCells (dequeuedReusable)

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

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2012-10-12
    • 2018-09-03
    相关资源
    最近更新 更多