在纵向和横向之间切换时,如何使用CompositionalLayout在UICollectionView中具有不同的行数

问题描述

使用合成布局,我试图在用户旋转设备(特别是在iPad上)时显示的行数(组)发生变化。我尝试覆盖viewWillLayoutSubviews和viewDidLayoutSubviews并调用collectionViewLayout.invalidateLayout()。达到此调用后,它不会执行任何操作,即没有重新计算行数。

进行布局的代码如下:

private func makeLayout() -> UICollectionViewLayout {
    let itemLayoutSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1/6),heightDimension: .fractionalHeight(1.0))
    let item = NSCollectionLayoutItem(layoutSize: itemLayoutSize)
    let inset: CGFloat = 2
    item.contentInsets = .init(top: inset,leading: 0,bottom: inset,trailing: 0)
    
    let numRowsTodisplay: CGFloat = getNumberOfRowsTodisplay(for: UIDevice.current)
    
    let groupLayoutSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),heightDimension: .fractionalHeight(1/numRowsTodisplay))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupLayoutSize,subitems: [item])
    
    let section = NSCollectionLayoutSection(group: group)
    
    let sectionHeader = NSCollectionLayoutBoundarySupplementaryItem(
        layoutSize: .init(widthDimension: .fractionalWidth(1.0),heightDimension: .fractionalHeight(1/numRowsTodisplay)),elementKind: Self.sectionHeaderElementKind,alignment: .top)
    sectionHeader.pinToVisibleBounds = true
    section.boundarySupplementaryItems = [sectionHeader]
    
    return UICollectionViewCompositionalLayout(section: section)
}

private func getNumberOfRowsTodisplay(for device: UIDevice) -> CGFloat {
    let numRowsTodisplay: CGFloat
    switch device.userInterfaceIdiom {
        case .phone:
            numRowsTodisplay = 6
        default:
            numRowsTodisplay = device.orientation.isLandscape ? 20 : 32
    }
    
    return numRowsTodisplay
}

在尝试并尝试解决此问题的同时,我能够通过重新创建 viewDidLayoutSubviews中的布局来重新计算行数。即通过以下方式:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    collectionView.collectionViewLayout = makeLayout()
}

但是,我不知道这是好/坏做法吗?它在计算上昂贵吗?对于我应该如何解决此问题的任何指示,我们将深表感谢。非常感谢。 :)

我目前正在从事的这个项目只是为了尝试为我尝试构建的应用程序使用不同的组件。因此,采用硬编码数字,只是考虑使用iPhone VS iPad,而不是使用尺寸类别并根据实际屏幕尺寸进行选择。我只是想弄清楚我现在该怎么做!谢谢! :)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)