【问题标题】:Changing UICollectionView layout depending on section根据部分更改 UICollectionView 布局
【发布时间】:2018-12-04 02:51:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你试过collectionView.setCollectionViewLayout吗?
  • 是的,我确实尝试过,但可能不是很好。但是collectionView.setCollectionViewLayout 会改变整个 UICollectionView 的布局对吧?不仅是我的特定部分(我的例子中的最后一个)
  • 使用单独的集合视图的好主意。使用自定义布局可能会很复杂
  • @Florian_L 您可以使用 pod WaterfallLayout 在每个部分的流/瀑布布局之间来回切换。

标签: ios swift uicollectionview uicollectionviewlayout


【解决方案1】:

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

要实现你想要的,你必须继承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

当您尝试构建第 3 节时,将出现第一个问题。对于这种情况,我建议您搜索“瀑布布局”,GitHub 上有实现。当你弄清楚它是如何工作的时候,你应该做以下事情:

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

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

这里有一些有用的链接:

【讨论】:

  • 感谢详细解答,我看看这个试试看。
  • 花了一些时间,但我终于能够根据您的感谢创建自己的UICollectionViewLayout
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多