15

考虑一个UICollectionView,它在横向和纵向上具有不同数量的项目和不同的布局(即:间距)。

当设备旋转时,需要做什么才能使这些更改动画化?我在Collection View Programming Guide上找不到任何关于如何处理旋转的提及。

4

5 回答 5

40

不需要重新加载集合视图的数据——调用[collectionView.collectionViewLayout invalidateLayout]将导致集合视图更新其布局。

在 UICollectionViewLayout 子类中重写shouldInvalidateLayoutForBoundsChange:以返回 YES 将导致在invalidateLayout集合视图的边界更改时(包括其大小更改时以及用户滚动其内容时)自动调用。

于 2013-08-07T16:48:37.303 回答
13

根据方向,我有不同数量的部分,自动旋转并没有改变它。我必须添加对 collectionView 的调用以重新加载数据。我正在使用 UICollectionViewController,如果您还有其他内容,请调整为您自己的集合视图属性:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(    NSTimeInterval)duration {
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.collectionView reloadData];
}
于 2012-12-17T03:50:29.270 回答
6

最快的方法是混合所有其他答案。

只需在您的 ViewController 中添加以下行:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    self.mCollectionView.collectionViewLayout.invalidateLayout()
}

您不需要重新加载数据。

于 2016-01-20T14:43:56.497 回答
3

我在 Swift 中使用了以下简单代码:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    collectionView.collectionViewLayout.invalidateLayout()
}
于 2016-10-03T18:15:14.033 回答
0

如果您只想在轮换活动中做某事,我正在使用这种方法:

- (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;
      }

具有横向和纵向所需的行为或例如取决于宽度。

您甚至可以保存以前的方向并检查它是否已更改以决定是否使布局无效。

即使您再次在导航控制器中返回,这也会刷新大小。

于 2015-05-06T11:36:31.620 回答