自定义animation从一个UICollectionViewLayout切换到另一个?

作为一个testing,我做了一个布局,以垂直线显示单元格,另一个以水平布局显示单元格。 当我调用[collectionView setCollectionViewLayout:layout animated:YES]; 它在两个位置之间非常干净地animation。

现在我想要做的是在最终到达目的地之前,所有的视图都进行了一些旋转,扭曲和旋转(可能使用CAKeyframeAnimations),但是我找不到一个合适的位置来吸引它。

我尝试了UICollectionViewLayoutAttributes包含一个animation属性,然后设置这些animation重写我使用的UICollectionViewCell applyLayoutAttributes:方法。 这工作…除了布局过渡完成后才出现。 如果我想使用这个,我必须有布局不改变对象的当前位置,只有在它达到这个应用属性代码的一部分,这似乎很多工作… … –

或者,我可以UICollectionView并覆盖setCollectionViewLayout:animated: UICollectionView但是这也看起来像是很多状态来保持布局之间。 这两种select都不是正确的,因为有一种简单的方法可以布局中增加/删除单元格。 我觉得应该有一些类似的布局之间的animation挂钩。

有谁知道最好的方法来获得我期望完成的?

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