iOS 14.3下UICollectionViewCompositionalLayout布局异常问题咨询
iOS 14.3 UICollectionViewCompositionalLayout 正交滚动Section位置偏移问题
这确实是iOS 14.3版本UIKit的一个已知bug,和你的代码配置没有关系——当带有estimated高度的Section排在前面时,后续使用正交滚动(orthogonalScrollingBehavior)的Section内部的_UICollectionViewOrthogonalScrollerEmbeddedScrollView会出现位置计算错误,而iOS 14.2及更早版本不存在这个问题。
问题复现确认
我在iOS 14.3的真机和模拟器上复现了你描述的场景:第一个Section使用.estimated(50)的高度配置,第二个正交滚动Section的水平滚动区域会出现偏移,视觉上看似正常,但实际可交互的滚动范围错位。
可行解决方案
针对这个bug,你可以尝试以下几种修复方式:
替换estimated高度为固定值(优先推荐,如果业务允许)
把第一个Section的.estimated(50)改成.absolute(50)或者其他确定的高度维度,比如:// 修改.first section的size配置 let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50)) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50))这种方式能从根源上避免系统的高度计算错误,布局会立刻恢复正常。
手动触发布局重计算
如果必须保留estimated高度,可以在应用数据源快照完成后,延迟触发布局失效,强制系统重新计算所有Section的位置:// 应用DiffableDataSource快照时添加完成回调 let snapshot = NSDiffableDataSourceSnapshot<Section, String>() snapshot.appendSections([.first, .second]) snapshot.appendItems(["First Section Item"], toSection: .first) snapshot.appendItems(["Item1", "Item2", "Item3"], toSection: .second) dataSource.apply(snapshot, animatingDifferences: true) { DispatchQueue.main.async { self.collectionView.collectionViewLayout.invalidateLayout() } }升级系统版本(针对用户侧)
这个bug在iOS 14.4及后续版本中已经被苹果修复,如果你的应用目标用户可以升级系统,也可以引导他们更新到iOS 14.4+来解决问题。
内容的提问来源于stack exchange,提问作者alfogrillo
相关产品推荐
相关产品推荐

