38

テストとして、セルを縦に並べて表示するレイアウトと、横に並べて表示するレイアウトを作成しました。私が呼び出す[collectionView setCollectionViewLayout:layout animated:YES];と、2 つの位置の間で非常にきれいにアニメーション化されます。

私がやりたいは、最終的に目的地に到着する前に、すべてのビューに画面の周りでいくつかのスピン、ワープ、フリップを実行させることです (おそらく CAKeyframeAnimations を使用)。

UICollectionViewLayoutAttributesアニメーション プロパティを含むようにサブクラス化してから、使用している のオーバーライドされたapplyLayoutAttributes:メソッドでそれらのアニメーションを設定しようとしましたUICollectionViewCell。これは機能します...ただし、レイアウトの移行が完了した後にのみ発生するようです。これを使用したい場合は、オブジェクトの現在の位置をすぐに変更しないようにレイアウトを設定する必要があります。これは、コードのこの適用属性部分に到達した後でのみです。これは大変な作業のように思えます...

または、 をサブクラス化UICollectionViewしてオーバーライドすることもできます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 に答える