根据部分更改 UICollectionView 布局
Changing UICollectionView layout depending on section
我目前正在实施一个 UICollectionView
,其中包含几个部分(比如说 4 个部分),如下图所示:
从第 0 部分到第 2 部分只是一个 UICollectionViewFlowLayout
,每个部分的单元格大小不同,但对于第 3 部分,它是自定义布局(瀑布布局)。
我已经实现了 2 种不同的布局,它们在单独的 UICollectionView
中运行良好,但我在同一 UICollectionView
中的 2 种布局之间切换时遇到了一些麻烦。
首先,是否可以将布局从一个部分更改为另一个部分,如果可以,可以通过哪种方式实现。
我认为你的问题 header 有点误导。您不需要更改每个部分的布局。您需要根据部分显示不同的布局。
要实现您想要的效果,您必须继承 UICollectionViewLayout
,然后根据部分确定布局。在你的情况下,我建议你将 UICollectionViewFlowLayout
子类化,因为它需要很多繁重的工作。
仅使用 UICollectionViewDelegateFlowLayout
. 即可轻松实现 Section 0 - Section 2
的样本
由于那里有 "full width" 个单元格,因此您可以使用以下方法确定每个单元格的大小和插图:
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 节 时,会出现第一个问题。对于这种情况,我建议您搜索 "Waterfall layout",GitHub 上有实现。当您弄清楚它是如何工作时,您应该执行以下操作:
- 创建
UICollectionView
- 创建
UICollectionViewFlowLayout
子类
- 将您的布局子类设置为 collection 视图布局。
- 第 0-2 节使用简单的
UICollectionViewFlowLayout
可能性。
- 对于像第 4 部分这样的部分,您应该覆盖
func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
并手动计算属性。
抱歉,如果我的回答过于宽泛。
这里有一些有用的链接:
我目前正在实施一个 UICollectionView
,其中包含几个部分(比如说 4 个部分),如下图所示:
从第 0 部分到第 2 部分只是一个 UICollectionViewFlowLayout
,每个部分的单元格大小不同,但对于第 3 部分,它是自定义布局(瀑布布局)。
我已经实现了 2 种不同的布局,它们在单独的 UICollectionView
中运行良好,但我在同一 UICollectionView
中的 2 种布局之间切换时遇到了一些麻烦。
首先,是否可以将布局从一个部分更改为另一个部分,如果可以,可以通过哪种方式实现。
我认为你的问题 header 有点误导。您不需要更改每个部分的布局。您需要根据部分显示不同的布局。
要实现您想要的效果,您必须继承 UICollectionViewLayout
,然后根据部分确定布局。在你的情况下,我建议你将 UICollectionViewFlowLayout
子类化,因为它需要很多繁重的工作。
UICollectionViewDelegateFlowLayout
. 即可轻松实现 Section 0 - Section 2
的样本
由于那里有 "full width" 个单元格,因此您可以使用以下方法确定每个单元格的大小和插图:
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 节 时,会出现第一个问题。对于这种情况,我建议您搜索 "Waterfall layout",GitHub 上有实现。当您弄清楚它是如何工作时,您应该执行以下操作:
- 创建
UICollectionView
- 创建
UICollectionViewFlowLayout
子类 - 将您的布局子类设置为 collection 视图布局。
- 第 0-2 节使用简单的
UICollectionViewFlowLayout
可能性。 - 对于像第 4 部分这样的部分,您应该覆盖
func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
并手动计算属性。
抱歉,如果我的回答过于宽泛。
这里有一些有用的链接: