从一个 UICollectionViewLayout 切换到另一个时的自定义动画?

Posted

技术标签:

【中文标题】从一个 UICollectionViewLayout 切换到另一个时的自定义动画?【英文标题】:Custom animation when switching from one UICollectionViewLayout to another? 【发布时间】:2013-02-14 00:53:33 【问题描述】:

作为测试,我制作了一种布局,以垂直线显示单元格,另一种以水平布局显示单元格。当我调用[collectionView setCollectionViewLayout:layout animated:YES]; 时,它在两个位置之间的动画非常干净。

现在我希望 让所有视图在最终到达目的地之前在屏幕上进行几次旋转、扭曲和翻转(可能使用 CAKeyframeAnimations),但我可以'找不到好地方挂这个。

我尝试将UICollectionViewLayoutAttributes 子类化以包含动画属性,然后将这些动画设置在我正在使用的UICollectionViewCell 的覆盖applyLayoutAttributes: 方法中。这行得通...除了它似乎只发生在布局转换完成之后。如果我想使用它,我必须让布局不要立即更改对象的当前位置,只有在它到达代码的这个应用属性部分之后,这似乎需要做很多工作......

或者我可以继承 UICollectionView 并覆盖 setCollectionViewLayout:animated:,但这似乎也需要在布局之间保留很多状态。这些选项似乎都不正确,因为有这样的 一种简单的方法来动画添加/删除单元格 布局。我觉得应该有类似的东西可以连接到 between 布局的动画中。

有谁知道获得我想要完成的任务的最佳方法?

【问题讨论】:

你能展示你的代码吗? 【参考方案1】:
#define degreesToRadians(x) (M_PI * (x) / 180.0)

UICollectionView *collectionView = self.viewController.collectionView;
HorizontalCollectionViewLayout *horizontalLayout = [HorizontalCollectionViewLayout new];
NSTimeInterval duration = 2;


[collectionView.visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell *cell, NSUInteger index, BOOL *stop)
 
     CABasicAnimation *rotationAnimation;
     rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
     rotationAnimation.toValue = @(degreesToRadians(360));
     rotationAnimation.duration = duration;
     rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

     [cell.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
 ];

[UIView animateWithDuration:duration
                 animations:^
 
     collectionView.collectionViewLayout = horizontalLayout;
 ];

【讨论】:

以上是关于从一个 UICollectionViewLayout 切换到另一个时的自定义动画?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView(3x3 Grid)与静态单元格分页

尽管宽度相等,但集合视图网格最后一行的显示方式不同 - swift iOS

为啥 docker 必须从 dockerfile 创建一个镜像,然后从该镜像创建一个容器,而不是从 Dockerfile 创建一个容器?

如果第一个没有可用记录,则从视图中选择并从一个表或另一个表中加入

从0到1实现一个Android路由——初探路由

从一个视图中选择数据并使用该数据从另一个视图中进行选择