【问题标题】:Building UICollectionViewLayout - customize size of a single item构建 UICollectionViewLayout - 自定义单个项目的大小
【发布时间】:2020-06-06 03:38:23
【问题描述】:

下面的代码可以使sectionIndex 中的UICollectionViewLayout 与其他部分相比,该部分中的每个项目具有不同的宽度/高度。我的问题是如何进一步更改本节中第一项的宽度:

myCollectionView = UICollectionView(frame: myFrame, collectionViewLayout: generateLayout())

.

func generateLayout() -> UICollectionViewLayout {

    let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int,
         layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in

     return self.generateStoryLayout(forSection: sectionIndex)
    }
    return layout
}

.

func generateStoryLayout(forSection: Int) -> NSCollectionLayoutSection {
    let itemSize = NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .fractionalWidth(1.0))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)

    print("generate story layout for this section")

    var groupSize = NSCollectionLayoutSize(
        widthDimension: .absolute(180),
        heightDimension: .absolute(216))

    //taller row in section 1
    if forSection == 1 {
        groupSize = NSCollectionLayoutSize(
             widthDimension: .absolute(250),
             heightDimension: .absolute(300))
    }

    let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitem: item, count: 1)

    let section = NSCollectionLayoutSection(group: group)
    section.orthogonalScrollingBehavior = .continuousGroupLeadingBoundary   //.groupPaging

    return section
}

非常感谢您的帮助!

我分别使用了不同的UICollectionView,它使用UICollectionViewFlowLayout 进行布局,layout:sizeForItemAt: 函数为UICollectionView 中的每个项目调用,我可以在那里确定它们的大小。

自定义myCollectionView 不会调用此layout:sizeForItemAt:

ViewController 确实符合 UICollectionViewDelegate

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout


    【解决方案1】:

    您是否已将 Estimate Size 设置为 none?

    如果 Estimate Size 为 Automatic,则

    layout:sizeForItemAt: 不会调用

    【讨论】:

    • layout:sizeForItemAt: 似乎特定于 UICollectionViewFlowLayout,我在这里没有使用。我现在看到,通过设置估计而不是实际宽度,项目会调整以适应内容的宽度,这很有帮助
    【解决方案2】:

    您需要使您的视图控制器符合UICollectionViewDelegateFlowLayoutUICollectionViewDelegate 以使此方法有效:

     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
    

    你正在使用UICollectionViewCompositionalLayout,所以你不需要sizeForItemAt

    请看看这些教程:

    【讨论】:

    • 我两者都符合,但是 myCollectionView 使用自定义 UICollectionViewLayout 并且不使用 UICollectionViewFlowLayout
    【解决方案3】:

    我在这里收到了一个建议,我在其他类似的线程上反复看到它需要关闭“估计大小”才能让layout:sizeForItemAt: 工作 - 但layout:sizeForItemAt: 特定于UICollectionViewFlowLayout,而不是由自定义UICollectionViewLayout调用

    这里的解决方案实际上是使用估计的大小。在告诉集合视图单元格估计大小时,您是在告诉他们使用内容的大小来确定单元格的大小。

    我的目标是增加某个部分中第一个单元格的宽度,因为该单元格中的图像比其他单元格更宽。通过使用.estimated widthDimension,第一个单元格会自动调整自己的大小,因为图像更宽。

    感谢 UICollectionView!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多