我在iOS 14.3上遇到了一个奇怪的布局问题,其中集合视图UICollectionViewCompositionalLayout
在我的情况下与UICollectionViewDiffableDataSource
. _UICollectionViewOrthogonalScrollerEmbeddedScrollView
当您有一个正交部分之前有一个固有高度部分时,问题在于内部的错误位置。
幸运的是,我能够很容易地重现该问题。考虑拥有这个数据源:
private var dataSource: UICollectionViewDiffableDataSource<Section, String>!
enum Section: Int, Hashable, CaseIterable {
case first = 0
case second = 1
}
对于每个部分,您创建以下布局:
private extension Section {
var section: NSCollectionLayoutSection {
switch self {
case .first:
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(50))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section: NSCollectionLayoutSection = .init(group: group)
return section
case .second:
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .absolute(200), heightDimension: .absolute(200))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section: NSCollectionLayoutSection = .init(group: group)
section.orthogonalScrollingBehavior = .continuous
section.contentInsets = .init(top: 10, leading: 10, bottom: 10, trailing: 10)
section.interGroupSpacing = 10
return section
}
}
}
打破布局的事情是同时进入.first
部分itemSize
和高度。groupSize
.estimated
您可以在iOS 14.3上看到以下结果:乍一看布局在视觉上是正确的,但您立即意识到它已损坏,因为内部滚动视图位于错误的位置。这意味着水平滚动错误地发生在蓝色区域。
在 iOS 14.2 之前运行完全相同的代码,您将获得正确的布局。
你怎么看这个问题?我是否遗漏了什么或者它可能是一个 UIKit 错误?
谢谢