根据部分更改 UICollectionView 布局

Posted

技术标签:

【中文标题】根据部分更改 UICollectionView 布局【英文标题】:Changing UICollectionView layout depending on section 【发布时间】: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 在每个部分的流/瀑布布局之间来回切换。 github.com/sgr-ksmt/WaterfallLayout 【参考方案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 上有实现。当你弄清楚它是如何工作的时候,你应该做以下事情:

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

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

这里有一些有用的链接:

CollectionView programming guide Waterfall layout

【讨论】:

感谢详细解答,我看看这个试试看。 花了一些时间,但我终于能够根据您的感谢创建自己的UICollectionViewLayout

以上是关于根据部分更改 UICollectionView 布局的主要内容,如果未能解决你的问题,请参考以下文章

更改 UICollectionView 部分标题的高度

根据单元格的不更改单元格高度动态更改 UICollectionView 高度

如何更改 UICollectionView 中整个部分的背景颜色?

UICollectionView 标题宽度

如何根据 UICollectionView 中有多少单元格来更改视图的大小

如何根据我放入 UITextbox 的文本量来更改 UICollectionView 单元格的垂直大小?