ios - 根据部分更改 UICollectionView 布局
问题描述
我目前正在实现一个UICollectionView
有几个部分(比如说 4),如下图所示:
从第 0 部分到第 2 部分UICollectionViewFlowLayout
,每个部分的单元格大小不同,但对于第 3 部分,它是自定义布局(瀑布布局)。
我已经实现了 2 种不同的布局,并且它们单独运行良好UICollectionView
,但是在相同的 2 种布局之间切换时我遇到了一些麻烦UICollectionView
。
首先,是否可以将布局从一个部分更改为另一个部分,如果可以,可以通过哪种方式完成。
解决方案
我认为您的问题标题有点误导。您无需更改每个部分的布局。您需要根据部分显示不同的布局。
要实现您想要的,您必须子类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
当您尝试构建Section 3时,将出现第一个问题。对于这种情况,我建议您搜索“瀑布布局”,GitHub 上有实现。当您弄清楚它的工作原理时,您应该执行以下操作:
- 创造
UICollectionView
- 创建
UICollectionViewFlowLayout
子类 - 将您的布局子类设置为集合视图布局。
- 对于第 0-2 节,使用简单的
UICollectionViewFlowLayout
可能性。 - 对于像第 4 部分这样的部分,您应该
func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
手动覆盖和计算属性。
对不起,如果我的回答太宽泛。
以下是一些有用的链接:
推荐阅读
- shiny - yaml::yaml.load(..., eval.expr = TRUE) 中的错误:在 Rmarkdown 中使用闪亮时
- c# - 当值是类类型时如何显示字典中的所有值
- javascript - 将具有不同 id 的元素拖放到相应的拖放区中
- c++ - 使用 memcpy 时的 C++(访问冲突写入位置 0xDDDDDDDD)
- redis - How to connect to redislabs in Python
- javascript - 在内容可编辑的 div 中获取插入符号的绝对位置?
- python - 查找插入到列表中的匹配项并在后续列表中保持顺序
- javascript - 如何在 vue js 中嵌套循环和数组?
- powershell - 为什么读取此 CSV 文件后我的 powershell 自定义属性为空?
- mysql - 如何在批量更新中检索受影响行的主键?