UICollectionViewFlowLayout 与子类化 UICollectionViewLayout

Posted

技术标签:

【中文标题】UICollectionViewFlowLayout 与子类化 UICollectionViewLayout【英文标题】:UICollectionViewFlowLayout vs subclassing UICollectionViewLayout 【发布时间】:2013-01-21 23:51:49 【问题描述】:

我知道记录在案的建议是使用 UICollectionViewFlowLayout 如果您正在做任何“像网格或基于行的中断布局”。但是,我不确定这是否适用于我的情况。

我想要一个网格,但想要一个换行布局。物品应该在水平和垂直方向上无限地布置,而无需堆叠。本质上是一个巨大的棋盘,如果内容超出框架,它会水平或垂直滚动​​。

要继承 UICollectionViewFlowLayout 我必须:

    覆盖prepareLayout 以阻止布局包装项目。这似乎需要做很多工作。 覆盖collectionViewContentSize

Apple 表示他们在制作 UICollectionViewFlowLayout 方面做了“很多艰苦的工作”,所以如果可以的话,我应该利用它。但是如果我必须覆盖prepareLayout 来关闭换行,我怀疑我正在丢掉他们的大部分工作。在他们剩下的工作中,我可能不会使用其中的大部分(例如,minimumLineSpacingForSectionAtIndex)。

因为我想要的布局太简单了,所以我怀疑我应该继承 UICollectionViewLayout,因为:

    我将有一个更简单、更清晰的实现,所有内容都在一个布局类中,而不是在子类和委托之间分散。 我认为这不会比继承 UICollectionViewFlowLayout 更难,因为在这两种情况下我都必须覆盖 prepareLayout,我怀疑这就是所有艰苦工作的所在. 与尝试在 UICollectionViewFlowLayout 子类之上添加另一个组件相比,我可以更好地以自定义方式调整其他 UICollectionViewLayoutAttributes。

我的结论正确吗?

【问题讨论】:

【参考方案1】:

UICollectionViewFlowLayout 无论如何都不能支持两个方向,它只能沿一个轴滚动,水平或垂直。所以你必须继承 UICollectionViewLayout 而不是 UICollectionViewFlowLayout

然后你必须重写 prepareForLayoutlayoutsAttributesForElementsInRect 方法,正如你所说的那样......

【讨论】:

我认为 UICollectionViewFlowLayout 的 scrollDirection 属性是通过从不让一个方向的 contentSize 大于框架来实现的。这将强制作为 UIScrollView 的子类的 UICollectionView 仅在一个方向上滚动。因此,我认为如果我覆盖 UICollectionViewFlowLayout 的 prepareLayout 和 collectionViewContentSize,我可能会使其双向滚动,尽管这会使 scrollDirection 属性无用。但是感谢您对子类 UICollectionViewLayout 的建议;这似乎是最干净的解决方案。 这是不正确的,创建了github.com/pavankataria/SwiftDataTables,如果你继承UICollectionViewFlowLayout,你可以双向滚动【参考方案2】:

您描述的布局(项目以无限长的水平线排列,部分以无限长的垂直线排列)类似于 App Store 的“特色”部分:)

我也一直打算在我的一些应用程序中使用类似的概念,我认为这里的技巧是它不是由单个 UICollectionView 处理的。看起来您正在寻找的内容可以通过使用UITableView 作为基础来实现,并且让您的内容的每个部分占据表格中的一个单元格。也就是说,每个UITableViewCell 将包含一个水平滚动的UICollectionView

UICollectionView 的关键限制有时并不容易理解,因为它毕竟是一个 scrollView。您可以覆盖某些功能以启用双向滚动,但如果您希望某些内容以一种方式滚动,而某些内容以另一种方式滚动,则必须创建嵌套的scrollViews。

【讨论】:

其实这不是我想要的。我很抱歉我不够清楚。 App Store 精选部分的每个部分都有独立的滚动。想象一个比屏幕还大的巨型棋盘。这就是我所追求的视觉效果。那时我束手无策,将 UICollectionViewLayout 子类化,实现起来并不难,而且我得到了我想要的东西,而不是试图用 FlowLayout 来解决它。如果我没记错的话,实现子类比编写 *** 问题要容易。

以上是关于UICollectionViewFlowLayout 与子类化 UICollectionViewLayout的主要内容,如果未能解决你的问题,请参考以下文章