嵌套垂直 UICollectionView 和动态高度
Posted
技术标签:
【中文标题】嵌套垂直 UICollectionView 和动态高度【英文标题】:Nested vertical UICollectionView and dynamic height 【发布时间】:2021-07-07 22:54:35 【问题描述】:我有一个嵌套了其他 2 个 UICollectionView 的父 UICollectionView:
父 UICollectionView(垂直)
第一个嵌套的 UICollectionView(水平)- 灰色
第二个嵌套的 UICollectionView(垂直)- 红色
父 UICollectionView
我使用numberOfSections(in collectionView:)
并手动设置父集合视图中的部分数量。在这种情况下,我return 2
;一个用于第一个(灰色)嵌套 horizontal UICollectionView,另一个用于第二个(红色)嵌套 vertical UICollectionView
然后在collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int)
我return 1
。这意味着每个嵌套的 UICollectionView 都将被放置在单个项目中。
对于每个部分,对于第一个嵌套的水平 UICollectionView 和特定单元格,我将 collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)
出列一个特定单元格 [参见 嵌套 UICollectionViews 步骤 3] [参见 嵌套 UICollectionViews 步骤 3 >] 用于第二个嵌套的垂直 UICollectionView。
然后我使用collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath)
设置section 中每个项目的大小。 这是我的问题开始的地方。但让我继续介绍如何设置嵌套的 UICollectionViews。
嵌套的 UICollectionViews
这是每个嵌套 UICollectionView 的 3 步过程:
我创建了 UICollectionViewCell(单元格的外观)
我使用 UICollectionViewController 来:
从 Firebase 获取数据 将步骤 1 中提到的单元格出列并传入从 Firebase 获取的数据 使用collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath)
设置每个项目的尺寸
我创建了另一个 UICollectionViewCell:
初始化步骤 2 中提到的 UICollectionViewController
使用此 UICollectionViewController 的视图并通过填充超级视图(也称为单元格)将其添加到单元格的 contentView
contentView.addSubview(UICollectionViewController().view) UICollectionViewController().view.fillSuperview()
问题
当我设置水平 UICollectionView(灰色)所在部分的尺寸时,我只需要将 UICollectionView 的高度与每个单元格的高度匹配即可。
但是当我设置垂直 UICollectionView 将是(红色)的部分的尺寸时,我需要知道单元格的数量来计算正确的高度。否则,该部分可能太大或太小。
知道如何通知父 UICollectionView 控制器垂直嵌套集合视图的单元格数量吗?
提前致谢。
【问题讨论】:
【参考方案1】:对于那些嵌套行为,我建议通过代码创建UICollectionView
,而不是 IB Storyboard,这样您就不必过多地处理自动调整大小的约束。您可以以编程方式创建UICollectionView
(而不是使用所需的frame.size
来创建UICollectionViewController
,然后将UICollectionViewFlowLayout
分配给它,这样您就可以更好地控制嵌套collectionView 中的项目布局应该有多大基于其框架。一些示例代码在这里:
lazy var layout: UICollectionViewFlowLayout =
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.frame.size
layout.scrollDirection = .horizontal
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
return layout
()
lazy var customCollectionView: UICollectionView =
let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.width * 0.5), collectionViewLayout: self.layout)
collectionView.backgroundColor = UIColor.clear
collectionView.dataSource = self
collectionView.delegate = self
let collectionCellNib = UINib.init(nibName: "CustomCell", bundle: Bundle.main)
collectionView.register(collectionCellNib, forCellWithReuseIdentifier: "customCellId")
return collectionView
()
【讨论】:
感谢您的回复!我总是以编程方式执行 UI(这里是 Brian Voong 团队 :))因为我的父 UICollectionview 控制器将托管许多不同类型的嵌套 UICollectionView,我想分离每个嵌套的 UICollectionView。所以数据获取是在每个嵌套的集合视图中完成的。我需要一种将这些信息(实际上是从 Firebase 收到的文章数量)从嵌套集合传递到父集合的方法,并且不会通过任何令人讨厌的回收行为影响应用程序。 我不确定我是否正确理解了您的问题,但是对于传递数据,您可以使用“委托”模式。这里有一些 Brian Voong 的视频(因为你喜欢他的教学):youtu.be/L2x2Yjoe-T4这能满足你的需要吗?以上是关于嵌套垂直 UICollectionView 和动态高度的主要内容,如果未能解决你的问题,请参考以下文章