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

Mas*_*oud 37 objective-c ios6 uicollectionview uicollectionviewlayout

作为测试,我做了一个布局,在垂直线上显示单元格,另一个在水平布局中显示它们.当我把[collectionView setCollectionViewLayout:layout animated:YES];它称为两个位置之间的动画非常干净.

现在,我喜欢做的是有各方面的意见做了几个旋转,扭曲,最后到达目的地之前的屏幕(可能使用CAKeyframeAnimations)左右翻转,但我不能找到一个好地方挂钩这一点.

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

或者我可以继承UICollectionView和覆盖setCollectionViewLayout:animated:,但在布局之间看起来似乎也有很多状态.无论这些optins的似乎是正确的,因为有这样的动画细胞的添加/删除一个简单的方法的布局.我觉得应该有类似的东西挂钩布局之间的动画.

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

Zel*_*lko 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;
 }];
Run Code Online (Sandbox Code Playgroud)