在垂直堆栈视图中具有自动项目大小的水平分页 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?的主要内容,如果未能解决你的问题,请参考以下文章
iOS CollectionView 具有水平分页而不是垂直滚动