根据部分更改UICollectionView布局

Flo*_*n_L 4 ios uicollectionview uicollectionviewlayout swift

我目前正在UICollectionView用几个部分(假设是4个)实现一个,如下图所示:

uicollectionview

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

我已经实现了2种不同的布局,它们可以在单独的环境中很好地工作UICollectionView,但是我在同一个2种布局之间切换时遇到了一些麻烦UICollectionView

首先,可以将布局从一个部分更改为另一个部分,如果这样的话,可以实现这一点。

few*_*ode 5

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

要实现所需的功能,必须将其子类化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
Run Code Online (Sandbox Code Playgroud)

当您尝试构建第3部分时,将出现第一个问题。对于这种情况,我建议您搜索“瀑布式布局”,GitHub上有一些实现。确定其工作原理后,应执行以下操作:

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

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

以下是一些有用的链接: