TableView-Like UICollectionView 布局

Posted

技术标签:

【中文标题】TableView-Like UICollectionView 布局【英文标题】:TableView-Like UICollectionView Layout 【发布时间】:2016-06-20 06:37:20 【问题描述】:

我有一个collectionview,可以在两种布局之间切换。一种布局类似于常规流布局,自动调整项目的宽度和高度。另一个应该是类似于 tableview 的布局,具有固定的项目宽度,但自动调整它们的高度。

我已经设法使用collectionView(_:layout:sizeForItemAtIndexPath) 实现了这两种布局,但只有固定的项目大小。因此,如果可能的话,我想在不实现上述委托方法的情况下充分利用自调整单元格。

我怎样才能最好地自动调整单元格的大小,同时强制它们全宽以进行类似 tableview 的布局?

【问题讨论】:

为什么不也有一个表格视图并在两者之间切换? 因为在单个 uicollectionview 中切换布局允许布局之间的过渡动​​画 这很有趣:github.com/Raizlabs/RZUtils/tree/master/RZUtils/Components/… 可能在 ios 11 中,我们会从 Apple 获得 UICollectionViewTableLayout,在内部它已经存在:pspdfkit.com/blog/2017/the-case-for-deprecating-uitableview 【参考方案1】:

当集合视图的宽度发生变化但不受滚动影响时,我们的自定义布局必须失效。幸运的是,集合视图将其新边界传递给了 shouldInvalidateLayoutForBoundsChange: 方法。这使我们能够将视图的当前边界与新值进行比较,并且仅在必须时才返回 YES:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds

CGRect oldBounds = self.collectionView.bounds;
if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) 
    return YES;
    
    return NO;

从一种集合视图布局到另一种的更改可以以类似的方式进行动画处理。当发送setCollectionViewLayout:animated: 方法时,集合视图将查询新布局以获取单元格的新布局属性,然后将每个单元格(由旧布局和新布局中的相同索引路径标识)从旧布局动画到新布局属性。你不必做任何事情。

【讨论】:

但是我怎样才能拥有自定大小的单元格,并让它们强制为全宽以实现类似 tableview 的布局? 通过制作两个布局子类文件。 你能发布完整的代码吗?我正在为自动调整大小而苦苦挣扎。 这可能对你有帮助...zappdesigntemplates.com/… 很遗憾没有,因为它使用固定的项目高度,而我想为此使用自动调整大小

以上是关于TableView-Like UICollectionView 布局的主要内容,如果未能解决你的问题,请参考以下文章

OC-创建瀑布流

在滚动期间重用 UICollectionViewCells

持久集合视图单元格选择

未调用 cellForItem 或 sizeForItem

UIButton 不会指向目标

以编程方式快速传递数据的问题