我有一个可以在2个布局之间切换的集合视图。一种布局就像一个常规的流布局,自动调整宽度和高度的项目大小。另一个应该是类似于tableview的布局,具有固定的项目宽度,但是自动调整它们的高度。
我已设法使用collectionView(_:layout:sizeForItemAtIndexPath)
实现这两个布局,但只能使用固定的项目大小。所以我想充分利用自行调整大小的单元,如果可能的话,不执行上述委托方法。
我如何才能最好地自动调整单元格大小,同时强制它们为全长宽度,以便进行类似于tableview的布局?
答案 0 :(得分:-2)
当集合视图的宽度发生变化但不受滚动影响时,我们的自定义布局必须无效。幸运的是,集合视图将其新边界传递给shouldInvalidateLayoutForBoundsChange:方法。这使我们能够将视图的当前边界与新值进行比较,并且只有在必要时才返回YES:
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
CGRect oldBounds = self.collectionView.bounds;
if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) {
return YES;
}
return NO;
}
从一个集合视图布局到另一个集合视图布局的更改可以以类似的方式进行动画处理。当发送setCollectionViewLayout:animated:
方法时,集合视图将查询新布局以获取单元格的新布局属性,然后将每个单元格(由旧布局和新布局中的相同索引路径标识)从旧布局设置为它的新属性。你不需要做任何事情。