UICollectionViewFlowLayout vs子类化UICollectionViewLayout

我知道如果您正在做任何“像网格或基于行的破坏布局”,那么记录的建议是使用UICollectionView Flow Layout。 但是,我不确定这是否属实。

我想要一个网格,但想要一个断行布局。 物品应无限制地水平和垂直布置,无需堆叠。 基本上,如果内容超出框架,则可以水平或垂直滚动​​的巨型棋盘。

要inheritanceUICollectionView 布局,我必须:

  1. 覆盖prepareLayout以停止包装项目的布局。 这似乎很多工作。
  2. 覆盖collectionViewContentSize

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

因为我想要的布局是如此简单,我怀疑我应该inheritanceUICollectionViewLayout,因为:

  1. 我将在一个布局类中使用更简单,更清晰的实现,而不是在子类和委托之间传播。
  2. 我不认为它会比inheritanceUICollectionView Flow Layout更难,因为我必须在两种情况下都覆盖prepareLayout ,我怀疑这是所有艰苦工作的地方。
  3. 我会以自定义的方式调整其他UICollectionViewLayoutAttributes,而不是尝试在UICollectionView Flow Layout子类之上添加另一个kludge。

我的结论是否正确?

UICollectionViewFlowLayout无论如何都不能支持两个方向,它只能沿着一个轴滚动,水平或垂直。 所以你必须将UICollectionViewLayout子类化为 UICollectionViewFlowLayout

然后你必须覆盖prepareForLayoutlayoutsAttributesForElementsInRect方法正如你所说的那样..

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

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

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