嵌套垂直 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;一个用于第一个(灰色)嵌套 horizo​​ntal 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 和动态高度的主要内容,如果未能解决你的问题,请参考以下文章

动态修复屏幕中的 UICollectionView 单元格

UICollectionview 动态高度问题

iOS 7.1 在 UIPopover 中嵌套 UICollectionView

将单元格高度固定到 UICollectionView 高度

UICollectionView 中的垂直和水平滚动方向

在水平和垂直两侧滚动 UICollectionView