【问题标题】:Dynamic item count in UICollectionViewCompositionalLayout possible?UICollectionViewCompositionalLayout 中的动态项目计数可能吗?
【发布时间】:2020-06-29 19:04:57
【问题描述】:

我想在我的 UICollectionView 中有多个部分。其中应该有包含文本的项目。使用“经典”collectionView 方法显示在同一行中的项目数取决于项目宽度。如果项目不适合同一行,则 collectionView 只会添加新行。所以有些行可能有 5 个项目,有些有 3 个。像这样:

当我使用组合布局时,我需要指定项目数。实际上,我希望集合视图能够处理多个部分的计数。

使用 UICollectionViewCompositionalLayout 甚至可能吗?

【问题讨论】:

    标签: swift uicollectionview uikit uicollectionviewlayout


    【解决方案1】:

    TLDR

    如果您在组合布局中仅使用一个 NSCollectionLayoutItem 对象(看起来就是这样),则使用以下方法之一创建布局组(取决于您希望布局流动的方向:

    NSCollectionLayoutGroup.horizontal(layoutSize:subitems:)
    NSCollectionLayoutGroup.vertical(layoutSize:subitems:)
    

    将您的 NSCollectionLayoutItem 对象作为 subItems 数组中的唯一项。

    布局集合视图时,您在 UICollectionViewDataSource 的(_:numberOfItemsInSection:) 中指定的项目数将用于布局您的项目。


    稍长

    我假设您指的是NSCollectionLayoutGroup.horizontal(layoutSize:subitem:count:) 之类的方法。如果是这样,那么您可能会误解 count 参数在这里的含义。

    在您使用不同 NSCollectionLayoutItem 对象(具有不同大小/布局)的组合的情况下,此处的 count 参数表示您希望该组中有多少该项目用于布局.

    当加载/重新加载集合视图时,您为 UICollectionViewDataSource 的 (_:numberOfItemsInSection:) 提供的任何计数仍将被呈现 - 如果该计数高于您在组合布局中指定的计数,则新组(遵循您的布局)将是创建以容纳额外的项目。

    【讨论】:

      【解决方案2】:

      首先感谢您抽出宝贵时间。

      我希望单元格的大小沿 x 轴(宽度)动态变化,然后 UIKit 应该将尽可能多的单元格放在一行中。似乎计数表明可以在一行中的固定数量的项目。

      这是我的代码

      
          func generateLayout() -> UICollectionViewLayout {
              let itemSize = NSCollectionLayoutSize(
                  widthDimension: .estimated(100),
                  heightDimension: .absolute(20))
      
              let fullPhotoItem = NSCollectionLayoutItem(layoutSize: itemSize)
      
              let groupSize = NSCollectionLayoutSize(
                  widthDimension: .fractionalWidth(1),
                  heightDimension: .estimated(20))
      
              let group = NSCollectionLayoutGroup.horizontal(
                  layoutSize: groupSize,
                  subitem: fullPhotoItem,
                  count: 1)
      
              let section = NSCollectionLayoutSection(group: group)
              let layout = UICollectionViewCompositionalLayout(section: section)
              return layout
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多