StackView 中 UICollectionView 的动态高度

dew*_*yze 3 ios autolayout uicollectionview swift

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

这是我所拥有的:

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

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

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

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

Lin*_*rth 6

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

@IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    collectionViewHeightConstraint.constant = collectionView.collectionViewLayout.collectionViewContentSize.height
    view.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)

当您重新加载集合视图时,请确保调用viewDidLayoutSubviews:

collectionView.reloadData()
viewDidLayoutSubviews()
Run Code Online (Sandbox Code Playgroud)