UICollectionViewCompositionalLayout 动态高度导致布局调整和闪烁

问题描述 投票:0回答:0

我正在使用 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

ios uicollectionview uicollectionviewcompositionallayout
© www.soinside.com 2019 - 2024. All rights reserved.