StackView 内 UICollectionView 的动态高度

Posted

技术标签:

【中文标题】StackView 内 UICollectionView 的动态高度【英文标题】:Dynamic height for UICollectionView inside StackView 【发布时间】:2019-01-28 14:58:01 【问题描述】:

我试图弄清楚如何在 UIStackView 内(或没有 StackView)为 UICollectionView 设置 AutoLayout 约束并感到困惑。我发现的 *** 上的其他答案似乎并不直接适用。

这是我所拥有的:

-----------------------------------
|  -----------------------------  |
|  |    UICollectionView # 1    | | (Sticky header for whole view)
|  -----------------------------  |
|  -----------------------------  |
|  |    UICollectionView # 2    | | (Table/grid with sections)
|  -----------------------------  |
|  -----------------------------  |
|  |    Button                  | |
|  -----------------------------  |
|  -----------------------------  |
|  |    UICollectionView # 3    | | (Sticky footer)
|  -----------------------------  |

我知道现在集合视图有固定部分标题,但集合 #2 有它自己的部分,所以这些是整个视图的固定标题,不存在。

我可以为视图#1、#3 和按钮设置约束,但#2 的高度未知。如何设置它以便视图可以动态更改高度,但视图 #3 始终可见。

即如果视图 #2 变得太长,它将开始滚动,而视图 #3 将保持可见。

【问题讨论】:

你的colletionview是水平的吗? 【参考方案1】:

如果你想要一个自定大小的集合视图,你必须为集合视图的高度创建一个NSLayoutConstraint

@IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint!

然后,在viewDidLayoutSubviews 中,更新高度约束并布局视图:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    collectionViewHeightConstraint.constant = collectionView.collectionViewLayout.collectionViewContentSize.height
    view.layoutIfNeeded()

当您重新加载您的收藏视图时,请务必致电viewDidLayoutSubviews

collectionView.reloadData()
viewDidLayoutSubviews()

【讨论】:

我是否需要重置该常量并在添加/删除新项目时执行view.layoutIfNeeded() 没有。当您执行collectionView.reloadData() 时,会自动调用viewDidLayoutSubviews。如果没有,请在更新收藏视图后立即致电 viewDidLayoutSubviews() 好的,我做了一个初步测试,这似乎工作得很好。谢谢! 完美答案!谢谢

以上是关于StackView 内 UICollectionView 的动态高度的主要内容,如果未能解决你的问题,请参考以下文章

在 StackView 内动态添加 ViewControllers - UIScrollView 内的 UIStackView

如何以编程方式更改 stackView 内单个 UIView 的高度?

如何向 StackView 的子视图内的视图添加约束

如何在 UIStackView 内排列的子视图上设置自定义高度?

如何在 StackView 内的两个视图之间进行动画处理?

StackView 在一个元素周围添加额外的空间