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 的高度?