我正在使用 UICollectionViewCompositionalLayout 在我的 iOS 应用程序中创建水平滚动(正交滚动)列表的垂直滚动列表。
当我为项目和组指定估计高度时,当较高的项目滚动到视图中时,集合视图会调整其高度。
另一方面,如果我指定组的估计高度和项目的小数高度 1.0,则无论设置的约束和压缩阻力如何,高度似乎都会被视为绝对值。
这是我的 createSection 函数:
func createSection(sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection {
let itemSize = NSCollectionLayoutSize(
widthDimension: .absolute(90),
heightDimension: .estimated(44)
)
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(90 / layoutEnvironment.container.effectiveContentSize.width),
heightDimension: .estimated(44)
)
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = 16.0
section.orthogonalScrollingBehavior = .continuous
return section
}
我尝试子类化
UICollectionViewCompositionalLayout
并覆盖 layoutAttributesForElementsInRect
以根据每个部分中最高的项目调整属性。然而,这导致滚动期间闪烁,我怀疑这是由于 prepare
在边界变化时被连续调用。
我事先并不知道每个单元格中视图的高度。但是,我已确保它们受到正确约束,并且将垂直轴上的压缩阻力设置为所需的值。
预期行为:每个单元格的高度根据其内容动态调整,当不同高度的单元格进入视图时不会导致布局变化或闪烁。
实际行为:为项目和组指定估计高度会导致滚动时布局发生变化,而为项目设置分数高度会导致组的估计高度被视为绝对值。重写layoutAttributesForElementsInRect并在那里调整会导致闪烁。
如何处理 UICollectionViewCompositionalLayout 中的动态单元格高度而不导致这些布局问题?我将非常感谢任何建议或潜在的解决方案。
这是一个演示该问题的 Swift Playground:https://github.com/aodhol/CompositionalProblem/tree/main