在方向更改时为 UICollectionView 设置动画

Posted

技术标签:

【中文标题】在方向更改时为 UICollectionView 设置动画【英文标题】:Animating UICollectionView on orientation changes 【发布时间】:2012-11-01 16:18:08 【问题描述】:

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

需要做什么才能在设备旋转时对这些更改进行动画处理?我在Collection View Programming Guide 上找不到任何关于如何处理旋转的信息。

【问题讨论】:

如果您使用 flowLayout 或其子类,它应该自动为您重新定位单元格。如果您是子类布局,您可能需要调整您返回的布局属性以对应于旋转。动画应该为你完成。 试试这个***.com/a/12999613/784009 【参考方案1】:

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

在 UICollectionViewLayout 子类中重写 shouldInvalidateLayoutForBoundsChange: 以返回 YES 将导致每当集合视图的边界发生变化(包括其大小发生变化和用户滚动其内容时)时自动调用 invalidateLayout

【讨论】:

和我的夜晚。【参考方案2】:

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(    NSTimeInterval)duration 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.collectionView reloadData];

【讨论】:

【参考方案3】:

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

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

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

您不需要重新加载数据。

【讨论】:

【参考方案4】:

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

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    collectionView.collectionViewLayout.invalidateLayout()

【讨论】:

请注意,这会随机崩溃。参考:***.com/questions/57750115/…【参考方案5】:

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

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

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

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

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

【讨论】:

以上是关于在方向更改时为 UICollectionView 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 检测滚动方向和更改图像

设备方向更改时如何更改 UiCollectionView 单元格大小?

在运行时为不同方向设置框架的首选方法

UICollectionView 更改方向不正确的单元格数

UICollectionView invalidateLayout 不会在屏幕方向更改时触发 sizeForItem

UICollectionViewFlowLayout、UICollectionView:更改屏幕方向会破坏单元格排列