18

私はUICollectionViewCellが挿入および/または削除されたときにアニメーションのスタイルをカスタマイズしたいと思います。UICollectionViewアニメーション(挿入/項目を削除)

私が必要とするのは、デフォルトではセルの挿入には滑らかなフェードがありますが、セルを削除するには左へ移動+フェードアウトアニメーションの組み合わせがあります。私は1つの問題でなければ、これでとても満足しています。

セルを削除した後でも新しいセルを追加すると再利用され、再利用時にはデフォルトのフェードが適用されずに追加されますが、代わりに左へ移動+フェードインされます。

私はアニメーションで、この矛盾を得ている理由はわかりません。これは既知のバグ/(:)私の側の)問題/愚かであれば、私はそれを修正する方法を教えてください。

それ以外の場合は、セルが削除されたときにカスタムアニメーションを設定する方法を教えてください。

おかげ

UPDATE

はUICollectionViewFlowLayoutをサブクラス化し、それだコード

- (UICollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { 

     return nil; 
} 

のこの行を追加することによって、奇妙なアニメーション動作を修正しました!文書によると、削除

ため

  • 挿入用initialLayoutAttributesForAppearingItemAtIndexPath:

  • finalLayoutAttributesForDisappearingItemAtIndexPath::あなたがUICollectionViewLayoutの独自のサブクラスを使用する場合は、メソッドを実装することができます:)

答えて

24

、返す属性はアニメーションの開始点として使用され、エンドポイントは標準ですあなたのレイアウトによって返されるすべての属性(または削除の反対の属性)。レイアウト属性には、位置、アルファ、トランスフォームが含まれます。 もちろん、Appleが提供するフローレイアウトを使用するよりも、独自のレイアウトクラスを作成することが多くなります。

編集:コメントで、あなたの質問に答えるために、ここでは全て同じ大きさの項目の行のレイアウトの超基本的な実装です。

セルのセル数はframeであり、デフォルトではalphaが1.0です(layoutAttributesForItemAtIndexPath:で定義)。それが削除されると、その特性は同じframeと0.0のalphaに対応する、finalLayoutAttributesForDisappearingItemAtIndexPath:で設定されたプロパティに削除する前に、現在の状態からアニメーション化されるであろう。それは動かずに消えてしまいます。しかし、右にセルが左に移動することになるだろう(そのindexPathが変更されたため、ので、それらのframelayoutAttributesForItemAtIndexPath:で設定された)。されています

- (CGSize)collectionViewContentSize 
{ 
    NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0]; 
    return CGSizeMake(numberOfItems * ITEM_WIDTH, ITEM_HEIGHT); 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSUInteger index = [indexPath indexAtPosition:0]; 
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
    attributes.frame = CGRectMake(index * ITEM_WIDTH, 0, ITEM_WIDTH, ITEM_HEIGHT); 
    return attributes; 
} 

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray *attributes = [NSMutableArray new]; 
    NSUInteger firstIndex = floorf(CGRectGetMinX(rect)/ITEM_WIDTH); 
    NSUInteger lastIndex = ceilf(CGRectGetMaxX(rect)/ITEM_WIDTH); 
    for (NSUInteger index = firstIndex; index <= lastIndex; index++) { 
     NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndexes:(NSUInteger [2]){ 0, index } length:2]; 
     [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; 
    } 
    return attributes; 
} 

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; 
    attributes.alpha = 0.0; 
    return attributes; 
} 
+0

ありがとうGuillaume。しかし、具体的な例を教えていただけますか?自分のセルが削除されたときにフェードアウトするようにしたい場合、カスタムUICollectionViewLayoutでどのように実装すればいいですか? –

+0

あなたの質問に答えて例を追加しました。 – Guillaume

5

circle Layoutをダウンロードしてください。

initialLayoutAttributesForAppearingItemAtIndexPath: 
finalLayoutAttributesForDisappearingItemAtIndexPath: 

これはあなたに適したサンプルカスタムレイアウトです。

関連する問題