考虑一个UICollectionView,它在横向和纵向方向上具有不同数量的项目和不同的布局(即:间距)。
当设备旋转时,需要做些什么才能对这些更改进行动画处理?我找不到如何处理Collection View Programming Guide上的旋转。
答案 0 :(得分:40)
没有必要重新加载集合视图的数据 - 调用[collectionView.collectionViewLayout invalidateLayout]
将导致集合视图更新其布局。
覆盖shouldInvalidateLayoutForBoundsChange:
以在UICollectionViewLayout子类中返回YES将导致在集合视图的边界发生更改时(包括其大小更改以及用户滚动其内容时)自动调用invalidateLayout
。
答案 1 :(得分:13)
根据方向我有不同数量的部分,自动旋转没有改变它。我不得不添加对collectionView的调用来重新加载数据。我正在使用UICollectionViewController,如果您还有其他内容,请调整到您自己的集合视图属性:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:( NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self.collectionView reloadData];
}
答案 2 :(得分:5)
最快捷的方式是混合所有其他答案。
只需在ViewController中添加以下行:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
self.mCollectionView.collectionViewLayout.invalidateLayout()
}
您无需重新加载数据。
答案 3 :(得分:2)
我在Swift中使用了以下简单代码:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
答案 4 :(得分:1)
如果您只想在轮换事件中执行某些操作,我将使用此方法:
- (void)updateViewConstraints {
[super updateViewConstraints];
[[_cvMyCollectionView collectionViewLayout] invalidateLayout];
}
然后从UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
/*
* Calculate size, example
* */
CGSize cellSize = CGSizeMake(150.0f, 150.0f);
return cellSize;
}
在横向和纵向中具有所需的行为,或者取决于宽度,例如。
您甚至可以保存以前的方向并检查它是否已更改以决定是否使布局无效。
即使您再次在导航控制器中返回,也会刷新尺寸。