38

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

现在我想做是让所有视图在最终到达目的地之前在屏幕上进行一些旋转、扭曲和翻转(可能使用 CAKeyframeAnimations),但我找不到一个很好的地方来连接它。

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

或者我可以 subclassUICollectionView和 override setCollectionViewLayout:animated:,但这似乎也需要在布局之间保留很多状态。这些选项似乎都不正确,因为有一种简单的方法可以为布局中的单元格添加/删除设置动画。我觉得应该有类似的东西来挂钩布局 之间的动画。

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

4

1 回答 1

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;
 }];
于 2013-04-03T08:44:32.213 回答