构建 UICollectionViewLayout - 自定义单个项目的大小

Building UICollectionViewLayout - customize size of a single item

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

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 作为其布局,并且为 UICollectionView 中的每个项目调用函数 layout:sizeForItemAt:,我可以在那里确定它们的尺寸。

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

ViewController确实符合UICollectionViewDelegate

您是否设置了估计大小是none?

layout:sizeForItemAt: 如果 Estimate Size 是自动的,则不会调用

您需要使视图控制器符合 UICollectionViewDelegateFlowLayoutUICollectionViewDelegate 才能使此方法起作用:

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

您正在使用 UICollectionViewCompositionalLayout,因此不需要 sizeForItemAt:

请查看这些教程:

我在这里收到了一个建议,我在其他类似的线程上反复看到它需要关闭 "estimate size" 才能使 layout:sizeForItemAt: 工作 - 但 layout:sizeForItemAt: 特定于 UICollectionViewFlowLayout,并且不被自定义调用 UICollectionViewLayout

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

我的目标是增加某个部分中第一个单元格的宽度,因为该单元格中的图像比其余单元格中的图像宽。通过使用 .estimated widthDimension 第一个单元格由于图像更宽而自动将自身尺寸变大。

谢谢 UICollectionView!