UICollectionViewFlowLayout - 强制某些项目的新行

时间:2015-12-04 07:29:59

标签: ios uicollectionview uicollectionviewlayout

我有一个垂直滚动的集合视图,带有流程布局。我已经将布局对象子类化,以便在每行上对齐元素(从这里和那里借用代码),并将节标题放在每个部分的左边距(插图)上(而不是上面),但是否则它只是一个流程布局。

我想强制将某些项目(不是全部)的单元格放在下一行"上,即使有足够的空间让它们适合于先前放置的单元格。

我可以看到自己这样做的唯一地方是覆盖UICollectionViewFlowLayout方法layoutAttributesForItemAtIndexPath(_:)

但是,只有委托/数据源知道哪些项需要新行,UICollectionViewDelegateUICollectionViewDataSourceUICollectionViewDelegateFlowLayout中的所有方法都不会出现给我一个指定的机会。

实现这一目标的优雅方式是什么?

1 个答案:

答案 0 :(得分:2)

你说得对,UICollectionViewFlowLayout用于在collectionView中定位项目。

您可以同时使用layoutAttributesForItemAtIndexPathlayoutAttributesForElementsInRect来设置项目位置,如下所示:https://stackoverflow.com/a/25566843/4320246

在您的情况下,您有几种解决方案来确定collectionView中每个项目的位置:

  1. UICollectionViewFlowLayout
  2. 子类的collectionView中定义每个项目和补充视图的绝对位置
  3. 让您的UICollectionViewFlowLayout子类决定某个项目是否需要换行并更改其UICollectionViewLayoutAttributes
  4. 创建一个新的协议子类UICollectionViewDelegateFlowLayout并添加- (BOOL)shouldItemBePlacedOnTheNextLineAtIndexPath:之类的方法,并在UICollectionViewFlowLayout的子类中调用此方法,如下所示:

    BOOL shouldPlaceOnNextLine = NO;

    id < MySubProtocolOfUICollectionViewDelegate > flowLayoutDelegate = (id < MySubProtocolOfUICollectionViewDelegate >)self.collectionView.delegate;
    if ([flowLayoutDelegate respondsToSelector:@selector(shouldItemBePlacedOnTheNextLineAtIndexPath:)]) {
        shouldPlaceOnNextLine = [flowLayoutDelegate shouldItemBePlacedOnTheNextLineAtIndexPath:indexPath]
    }
    
  5. 但是,我建议你采用第一个解决方案:让UICollectionViewFlowLayout的子类确定项目和补充视图的位置,如果需要,可以在dataSource / delegate中调用[(MyCustomFlowLayout *)self.collectionView.collectionViewLayout isItemForceOnNewLine]

    在我看来,这是最优雅的解决方案,因为如果要动态更改collectionView外观,仍然可以从一个自定义布局切换到另一个。