根据部分更改 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 中整个部分的背景颜色?