根据部分更改 UICollectionView 布局

Changing UICollectionView layout depending on section

我目前正在实施一个 UICollectionView,其中包含几个部分(比如说 4 个部分),如下图所示:

从第 0 部分到第 2 部分只是一个 UICollectionViewFlowLayout,每个部分的单元格大小不同,但对于第 3 部分,它是自定义布局(瀑布布局)。

我已经实现了 2 种不同的布局,它们在单独的 UICollectionView 中运行良好,但我在同一 UICollectionView 中的 2 种布局之间切换时遇到了一些麻烦。

首先,是否可以将布局从一个部分更改为另一个部分,如果可以,可以通过哪种方式实现。

我认为你的问题 header 有点误导。您不需要更改每个部分的布局。您需要根据部分显示不同的布局。

要实现您想要的效果,您必须继承 UICollectionViewLayout,然后根据部分确定布局。在你的情况下,我建议你将 UICollectionViewFlowLayout 子类化,因为它需要很多繁重的工作。

仅使用 UICollectionViewDelegateFlowLayout.

即可轻松实现

Section 0 - Section 2 的样本

由于那里有 "full width" 个单元格,因此您可以使用以下方法确定每个单元格的大小和插图:

func collectionView(_ collectionView: UICollectionView, 
                      layout collectionViewLayout: UICollectionViewLayout, 
           insetForSectionAt section: Int) -> UIEdgeInsets

func collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize

func collectionView(UICollectionView, layout: UICollectionViewLayout, minimumLineSpacingForSectionAt: Int) -> CGFloat

当您尝试构建第 3 节 时,会出现第一个问题。对于这种情况,我建议您搜索 "Waterfall layout",GitHub 上有实现。当您弄清楚它是如何工作时,您应该执行以下操作:

  1. 创建UICollectionView
  2. 创建UICollectionViewFlowLayout 子类
  3. 将您的布局子类设置为 collection 视图布局。
  4. 第 0-2 节使用简单的 UICollectionViewFlowLayout 可能性。
  5. 对于像第 4 部分这样的部分,您应该覆盖 func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? 并手动计算属性。

抱歉,如果我的回答过于宽泛。

这里有一些有用的链接: