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

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

这是我所拥有的:

-----------------------------------
|  -----------------------------  |
|  |    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是水平的吗?

标签: ios swift uicollectionview autolayout


【解决方案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()。
  • 好的,我做了一个初步测试,这似乎工作得很好。谢谢!
  • 完美答案!谢谢
猜你喜欢
  • 2019-10-12
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2018-09-30
  • 2021-05-18
  • 2020-07-09
相关资源
最近更新 更多