在垂直堆栈视图中具有自动项目大小的水平分页 UICollectionView?

Posted

技术标签:

【中文标题】在垂直堆栈视图中具有自动项目大小的水平分页 UICollectionView?【英文标题】:Horizontal paging UICollectionView with automatic item size in a vertical stack view? 【发布时间】:2021-01-06 15:51:27 【问题描述】:

我有一个主要的垂直堆栈视图(第 1 帧),它有一个带有流布局的水平分页集合视图(CollectionView),它有几个单元格(Cell)。每个单元格都带有几个标签(标题、描述)的垂直堆栈视图。

有没有办法让最高的单元格决定集合视图的高度,而主堆栈视图的宽度决定单元格的宽度?


默认情况下,当我使用layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize 时,集合视图不可见(似乎它不会“继承”单元格的高度)。

目前,我通过为集合视图设置固定高度来解决该问题,并在 collectionView(_:layout:sizeForItemAt:) 中手动定义项目大小(并且单元格是灵活的)。

【问题讨论】:

您是否要让单元格的内容定义集合视图的高度?您的单元格有一个 “几个标签的堆栈视图” ...您的意思是 垂直 堆栈视图吗?所有单元格的高度都相同吗?或者您希望您的水平集合视图单元格具有不同的高度? @DonMag 感谢您回来!是的,最高的单元格最好定义集合视图的高度。是的,带有标签的堆栈视图是垂直的(我也会更新问题)。 您将拥有多少个单元格?一些”?或者可能是“很多”? @DogMag 添加了一个类似于我即将做的快速草图。对于我当前的用例,只有 3 个单元格(带有静态内容),但我正在寻找一种可扩展的方法。 @DonMag 我澄清了这个问题,也许它有助于回答。 【参考方案1】:

由于 CollectionViews(和 TableViews)没有intrinsicContentSize,如果没有适当的约束,布局引擎就无法知道集合的正确大小。需要一个子类来提供此属性。

在你的子类中:


override var intrinsicContentSize: CGSize 
    return CGSize(self.contentSize.height, self.superview!.bounds.width)


另外,不要忘记在重新加载数据时使您的内容大小无效:


override func reloadData() 
    super.reloadData()
    self.invalidateIntrinsicContentSize()


有关intrinsicContentSize 的更详细说明,请查看Apple 的Documentation

【讨论】:

【参考方案2】:

由于内容是静态的,我认为在这里简单地使用UIScrollView 是一个非常可行的选择(因为集合视图的动态特性不是必需的)。集合视图可以是嵌入到滚动视图中的堆栈,然后可以在初始化时简单地设置维度之间的包含。

【讨论】:

以上是关于在垂直堆栈视图中具有自动项目大小的水平分页 UICollectionView?的主要内容,如果未能解决你的问题,请参考以下文章

带有 TabView、SwiftUI 的水平分页滚动视图

具有水平分页和垂直滚动的 UICollectionView

iOS CollectionView 具有水平分页而不是垂直滚动

UITableViewCell 具有嵌入式垂直堆栈视图设置,具有自动布局和动态高度

具有水平分页的 UIScrollView 不居中子视图

UICollectionView - 一次一个单元格的水平分页