我有一个垂直滚动的集合视图,带有流程布局。我已经将布局对象子类化,以便在每行上对齐元素(从这里和那里借用代码),并将节标题放在每个部分的左边距(插图)上(而不是上面),但是否则它只是一个流程布局。
我想强制将某些项目(不是全部)的单元格放在下一行"上,即使有足够的空间让它们适合于先前放置的单元格。
我可以看到自己这样做的唯一地方是覆盖UICollectionViewFlowLayout
方法layoutAttributesForItemAtIndexPath(_:)
。
但是,只有委托/数据源知道哪些项需要新行,UICollectionViewDelegate
,UICollectionViewDataSource
或UICollectionViewDelegateFlowLayout
中的所有方法都不会出现给我一个指定的机会。
实现这一目标的优雅方式是什么?
答案 0 :(得分:2)
你说得对,UICollectionViewFlowLayout
用于在collectionView中定位项目。
您可以同时使用layoutAttributesForItemAtIndexPath
和layoutAttributesForElementsInRect
来设置项目位置,如下所示:https://stackoverflow.com/a/25566843/4320246
在您的情况下,您有几种解决方案来确定collectionView中每个项目的位置:
UICollectionViewFlowLayout
UICollectionViewFlowLayout
子类决定某个项目是否需要换行并更改其UICollectionViewLayoutAttributes
创建一个新的协议子类UICollectionViewDelegateFlowLayout
并添加- (BOOL)shouldItemBePlacedOnTheNextLineAtIndexPath:
之类的方法,并在UICollectionViewFlowLayout
的子类中调用此方法,如下所示:
BOOL shouldPlaceOnNextLine = NO;
id < MySubProtocolOfUICollectionViewDelegate > flowLayoutDelegate = (id < MySubProtocolOfUICollectionViewDelegate >)self.collectionView.delegate;
if ([flowLayoutDelegate respondsToSelector:@selector(shouldItemBePlacedOnTheNextLineAtIndexPath:)]) {
shouldPlaceOnNextLine = [flowLayoutDelegate shouldItemBePlacedOnTheNextLineAtIndexPath:indexPath]
}
但是,我建议你采用第一个解决方案:让UICollectionViewFlowLayout
的子类确定项目和补充视图的位置,如果需要,可以在dataSource / delegate中调用[(MyCustomFlowLayout *)self.collectionView.collectionViewLayout isItemForceOnNewLine]
。
在我看来,这是最优雅的解决方案,因为如果要动态更改collectionView外观,仍然可以从一个自定义布局切换到另一个。