StackView 中 UICollectionView 的动态高度

Dynamic height for UICollectionView inside StackView

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

这是我的资料:

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

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

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

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

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

@IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint!

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

重新加载集合视图时,请务必调用 viewDidLayoutSubviews:

collectionView.reloadData()
viewDidLayoutSubviews()