我在 iOS 14.3 上遇到了奇怪的布局问题,使用结合本人的UICollectionViewCompositionalLayoutUICollectionViewDiffableDataSource的集合 View 进行了集合 View 。
问题是当您在一个正交部分前面有一个固有高度部分时,内部_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部分中同时设置了itemSizegroupSize高度为.estimated的代码。
您可以在 iOS 14.3 上看到以下结果:乍一看布局在视觉上是正确的,但是您立即意识到它已损坏,因为内部滚动 View 在错误的位置。
这意味着水平滚动在蓝色区域中错误地发生。
ios - iOS 14.3上的UICollectionViewCompositionalLayout错误-LMLPHP
在iOS 14.2 上运行完全相同的代码,您将获得正确的布局。
ios - iOS 14.3上的UICollectionViewCompositionalLayout错误-LMLPHP
您如何看待这个问题?
我是否缺少某些东西,或者可能是UIKit错误?
谢谢

最佳答案

由于此回归,我们具有估计高度的 header ,并且带有_UICollectionViewOrthogonalScrollerEmbeddedScrollView的某些部分被完全破坏了。所以这是一种适用于我们的情况的解决方案

public final class CollectionView: UICollectionView {

    public override func layoutSubviews() {
        super.layoutSubviews()

        guard #available(iOS 14.3, *) else { return }

        subviews.forEach { subview in
            guard
                let scrollView = subview as? UIScrollView,
                let minY = scrollView.subviews.map(\.frame.origin.y).min(),
                minY > scrollView.frame.minY
            else { return }

            scrollView.contentInset.top = -minY
            scrollView.frame.origin.y = minY
        }
    }
}

关于ios - iOS 14.3上的UICollectionViewCompositionalLayout错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65369130/

10-14 20:51
查看更多