首页 > 解决方案 > 根据部分更改 UICollectionView 布局

问题描述

我目前正在实现一个UICollectionView有几个部分(比如说 4),如下图所示:

uicollectionview

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

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

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

标签: iosswiftuicollectionviewuicollectionviewlayout

解决方案


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

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

Section 0 - Section 2只需使用UICollectionViewDelegateFlowLayout.

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

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

当您尝试构建Section 3时,将出现第一个问题。对于这种情况,我建议您搜索“瀑布布局”,GitHub 上有实现。当您弄清楚它的工作原理时,您应该执行以下操作:

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

对不起,如果我的回答太宽泛。

以下是一些有用的链接:


推荐阅读