【发布时间】:2021-03-29 19:42:51
【问题描述】:
我在 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
}
}
}
打破布局的事情是在itemSize 和groupSize 和.estimated 高度进入.first 部分。
您可以在 iOS 14.3 上看到以下结果:乍一看布局在视觉上是正确的,但您立即意识到它被破坏了,因为内部滚动视图位于错误的位置。 这意味着水平滚动错误地发生在蓝色区域。
运行完全相同的代码直到 iOS 14.2 你得到正确的布局。
您对这个问题有什么看法? 我是否遗漏了什么或者可能是 UIKit 错误?
谢谢
【问题讨论】:
-
嗨,matt,我们在一周前向 Apple 报告了这个问题,让我们等待答复。当我得到任何更新时,我会保持主题更新。谢谢你的回答。
-
我们遇到了完全相同的问题。当
NSCollectionLayoutDimension的estimatedHeight设置为高于正在呈现的实际单元格的值时,似乎会发生这种情况。当您将estimatedHeight设置为最小尺寸时,它会按预期工作,因此放大似乎有效,但缩小似乎会导致_UICollectionViewOrthogonalScrollerEmbeddedScrollView定位错误。我们目前正在通过将estimatedHeight包裹在if #available(iOS 14.3, *) { ... } else { ... }之间来解决此问题。也在努力提交RADAR。 -
大家好,开发者技术支持回复我们说,collection view 团队已经意识到这个错误,并且应该在下一个 iOS 版本中发布修复。遗憾的是,他们没有向我们提供修复的预计发布日期。
-
是否为此提交了 RADAR?如果可以,我想监控它
-
我确实向 Apple 提出了问题,但它仍被标记为 Open 并且尚未经过整理。我刚刚检查了 Xcode 12.4 RC / iOS 14.4 RC,不幸的是问题仍然存在。
标签: ios swift uicollectionview uikit uicollectionviewcompositionallayout