13

UICollectionViewFlowLayout と次の形式を使用する UICollectionView があるとします。

1 2 3
4 5 6
7 8 9

セル 9 をタッチしてセル 6 の上にドラッグし、セル 9 をセル 6 の場所に移動し、セル 6 をセル 9 があった場所に移動します。

1 2 3
4 5 9
7 8 6

セル 6 をセル 9 の場所に簡単に移動してアニメーション化し、セル 9 をセル 6 の場所に移動してアニメーション化する方法はありますか? または、UICollectionViewLayout をサブクラス化する必要がありますか? UICollectionViewLayout をサブクラス化する必要がある場合、これはどのように行われますか? セルの中心を明示的に設定しようとしました

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

しかし、成功しませんでした。

4

3 に答える 3

22

多くの頭をぶつけた後、私が見つけた解決策は、の中で使用することmoveItemAtIndexPath:toIndexPathですperformBatchUpdates:completionのドキュメントによるとperformBatchUpdates:completion

このメソッドは、複数の個別のアニメーションではなく、1 回のアニメーション操作でコレクション ビューのセルを挿入、削除、再読み込み、または移動する場合に使用できます。更新パラメーターで渡されたブロックを使用して、実行するすべての操作を指定します。

だから、私が本質的にやったことは

[self performBatchUpdates:^{
    [self moveItemAtIndexPath:fromIp toIndexPath:toIp];
    [self moveItemAtIndexPath:toIp toIndexPath:fromIp];
} completion:^(BOOL finished) {
    // update data source here
    // e.g [dataSource exchangeObjectAtIndex:fromIp.row withObjectAtIndex:toIp.row];
}];
于 2012-12-17T19:03:27.637 に答える
0

moveItemAtIndexPath:toIndexPath: を使用してアイテムを直接並べ替えてみましたか?

-次に完全なリロードを行うときに変更が保持されるように、基礎となるモデル コレクションを実際に並べ替えていることを確認してください。

于 2012-12-14T23:48:41.360 に答える