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

时间:2013-02-14 00:53:33

标签: objective-c ios6 uicollectionview uicollectionviewlayout

作为测试,我制作了一个布局,在垂直线上显示单元格,另一个布局以水平布局显示它们。当我打电话给[collectionView setCollectionViewLayout:layout animated:YES];时,它会非常干净地在两个位置之间激活。

现在我喜欢要做的就是让所有视图在最终到达目的地之前在屏幕周围进行一些旋转,扭曲和翻转(可能使用CAKeyframeAnimations),但我可以'找个合适的地方。

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

或者我可以继承UICollectionView并覆盖setCollectionViewLayout:animated:,但这似乎也是布局之间保持不变的状态。这些optins似乎都没有,因为这样的是一种简单的方法,可以在布局中为单元格添加/删除动画。我觉得应该有类似的东西挂钩布局之间的动画

有谁知道获得我想要完成的目标的最佳途径?

1 个答案:

答案 0 :(得分:8)

#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;
 }];