【问题标题】:Dynamic item count in UICollectionViewCompositionalLayout possible?UICollectionViewCompositionalLayout 中的动态项目计数可能吗?
【发布时间】:2020-06-29 19:04:57
【问题描述】:
我想在我的 UICollectionView 中有多个部分。其中应该有包含文本的项目。使用“经典”collectionView 方法显示在同一行中的项目数取决于项目宽度。如果项目不适合同一行,则 collectionView 只会添加新行。所以有些行可能有 5 个项目,有些有 3 个。像这样:
当我使用组合布局时,我需要指定项目数。实际上,我希望集合视图能够处理多个部分的计数。
使用 UICollectionViewCompositionalLayout 甚至可能吗?
【问题讨论】:
标签:
swift
uicollectionview
uikit
uicollectionviewlayout
【解决方案1】:
TLDR
如果您在组合布局中仅使用一个 NSCollectionLayoutItem 对象(看起来就是这样),则使用以下方法之一创建布局组(取决于您希望布局流动的方向:
NSCollectionLayoutGroup.horizontal(layoutSize:subitems:)
NSCollectionLayoutGroup.vertical(layoutSize:subitems:)
将您的 NSCollectionLayoutItem 对象作为 subItems 数组中的唯一项。
布局集合视图时,您在 UICollectionViewDataSource 的(_:numberOfItemsInSection:) 中指定的项目数将用于布局您的项目。
稍长
我假设您指的是NSCollectionLayoutGroup.horizontal(layoutSize:subitem:count:) 之类的方法。如果是这样,那么您可能会误解 count 参数在这里的含义。
在您使用不同 NSCollectionLayoutItem 对象(具有不同大小/布局)的组合的情况下,此处的 count 参数表示您希望该组中有多少该项目用于布局.
当加载/重新加载集合视图时,您为 UICollectionViewDataSource 的 (_:numberOfItemsInSection:) 提供的任何计数仍将被呈现 - 如果该计数高于您在组合布局中指定的计数,则新组(遵循您的布局)将是创建以容纳额外的项目。
【解决方案2】:
首先感谢您抽出宝贵时间。
我希望单元格的大小沿 x 轴(宽度)动态变化,然后 UIKit 应该将尽可能多的单元格放在一行中。似乎计数表明可以在一行中的固定数量的项目。
这是我的代码
func generateLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(
widthDimension: .estimated(100),
heightDimension: .absolute(20))
let fullPhotoItem = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1),
heightDimension: .estimated(20))
let group = NSCollectionLayoutGroup.horizontal(
layoutSize: groupSize,
subitem: fullPhotoItem,
count: 1)
let section = NSCollectionLayoutSection(group: group)
let layout = UICollectionViewCompositionalLayout(section: section)
return layout
}