2012-09-22 6 views
6

私はinsertItemsAtIndexPathsまたはmoveItemAtIndexPath:toIndexPath:のようなものについて話しています。私はアニメーションブロックでそれをラップしようとしましたが、うまくいきませんでした。アニメーションは.25秒または0.3秒で止まっているようですが、これを遅くしたいと思います。誰かがこれが公開APIで可能かどうかを知っていますか?UICollectionViewsのアニメーションの速度を変更する方法はありますか?

答えて

5

絶対に!しかし、UIViewアニメーションブロックを使用して正しく行うことはできません。あなたはCore Animationを掘り下げる必要があります。

には、それぞれUICollectionViewCellをサポートするアニメーションが便利に追加されます。しかし、独自のレイアウト(または既存のサブクラス)を実装する場合、finalizeCollectionViewUpdatesメソッドでこれらのアニメーションに必要な変更をすべて行うことができます。

UICollectionViewLayoutクラスのドキュメントから:

コレクションビューは、所定の場所に変更をアニメーション化する前の前の最後のステップとして、このメソッドを呼び出します。ここで

、独自にデフォルトの位置アニメーションを交換する方法の例です:CALayer上のアニメーション関連のメソッドで

- (void)finalizeCollectionViewUpdates 
{ 
    for (UICollectionViewCell *cell in [self.collectionView visibleCells]) 
    { 
     CAAnimation *positionAnimation = [cell.layer animationForKey:@"position"]; 
     if (positionAnimation) 
     { 
      [cell.layer removeAnimationForKey:@"position"]; 

      CALayer *presentationLayer = cell.layer.presentationLayer; 
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
      [animation setFromValue:[NSValue valueWithCGPoint:presentationLayer.position]]; 
      [animation setToValue:[NSValue valueWithCGPoint:cell.layer.position]]; 
      [animation setDuration:0.4]; 

      [cell.layer addAnimation:animation forKey:@"position"]; 
     } 
    } 
} 

ルックあなたはアニメーションが現在実行されているものに掘ることができる方法を確認しますあなたの層に。

このアプローチを使用すると、CAKeyframeAnimationなど考えられるオーバーシュート/バウンスエフェクトを追加できます。また、一部のアニメーション(サイズなど)を選択的に無効にし、他のアニメーション(ポジションなど)を保持するなどの作業を行うこともできます。

1

ここからこのオーバーのコピー:https://stackoverflow.com/a/18392148/1751266

あなたはCALayerので任意のアニメーションの速度を変更することができます。だから、UICollectionViewのために、これは次のようになります。

[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f]; 

そして、あなたは、元の速度戻っ変更することができます。これが機能する

[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f]; 

をあなたはQuartzCoreをインポートする必要があります。

#import <QuartzCore/QuartzCore.h> 

アニメーション化されたUIImageViewsなどを含む、同じレイヤー上の他のアニメーションにも影響しますので、補正が必要な場合があります。

関連する問題