9

iOS 6 の UICollectionView でアイテムの並べ替えをアニメーション化しようとしています。

私はこのコードを書きました:

    NSMutableDictionary *from = [NSMutableDictionary dictionaryWithCapacity:self.count];
    for (int ii = 0; ii < self.count; ii++) {
        MyItem item = [self getItemAtIndex:(NSInteger)ii];
        [from setObject:[NSNumber numberWithInt:ii] forKey:[NSNumber numberWithInt:item.id]];
    }

    [self sort];

    [self.collectionView performBatchUpdates:^{
        for (int ii = 0; ii < self.count; ii++) {
            MyItem item = [self getItemAtIndex:(NSInteger)ii];
            NSNumber *prevPos = (NSNumber *)[from objectForKey:[NSNumber numberWithInt:item.id]];
            if ([prevPos intValue] != ii) {
                NSIndexPath *from = [NSIndexPath indexPathForItem:prevPos.intValue inSection:0];
                NSIndexPath *to = [NSIndexPath indexPathForItem:ii inSection:0];
                [self.collectionView moveItemAtIndexPath:from toIndexPath:to];
            }
        }
    } completion:nil];

まず、アイテムの現在の場所をすべて辞書に保存し、次にアイテムを新しい位置に並べ替え、次にすべてのアイテムを調べて、古い位置から新しい位置に移動します。

これは、すべてのアイテムが画面に表示されている場合にうまく機能しますが、リストが 10 を超えると、一部のアイテムが現在表示されない場合 (リストの表示セクションの上または下にあるため)、これらのアイテムが突然ポップします。目に見えるインデックスに存在し、他の場所にアニメーション化され、アニメーションが停止すると非表示になります。他のアイテムの上に表示されるアイテムがあるため、これは本当に奇妙に見えます...

これは iOS 6 の UICollectionView の問題ですか? 何か間違っているのでしょうか?

4

1 に答える 1

5

UICollectionViewアニメーションの見栄えを悪くするような方法でセルを再利用しているようです。画面外に出たセルは再利用できるようになります。

では、なぜあなたのアニメーションはファンキーに見えるのでしょうか?

セルの開始位置と終了位置、およびセルが非表示になるかどうかは、セルを移動するときにすべて自動的に処理されます。これらのアニメーションを適切に表示するには、データ ソースも更新する必要があります。これは、アニメーション中にセルの開始位置と終了位置を決定するためにコードがデータ ソースを使用しているように見えるためです。

インデックス更新ブロックを呼び出す前に、データ ソースが新しいインデックスの場所で更新されていることを確認してください。そうすることで、Apple のコードは、細胞をより美しく、たとえば見た目に美しい方法で動かすために必要な情報を手に入れることができます。

UICollectionViews に関するAppleのドキュメントから:

単一のセクションまたはアイテムを挿入、削除、または移動するには、次の手順に従う必要があります。

  1. データ ソース オブジェクトのデータを更新します。
  2. コレクション ビューの適切なメソッドを呼び出して、セクションまたはアイテムを挿入または削除します。

コレクション ビューに変更を通知する前に、データ ソースを更新することが重要です。コレクション ビュー メソッドは、データ ソースに現在正しいデータが含まれていることを前提としています。そうでない場合、コレクション ビューはデータ ソースから間違ったアイテムのセットを受け取るか、そこにないアイテムを要求してアプリをクラッシュさせる可能性があります。

于 2012-12-09T21:06:37.403 に答える