84

私のプロジェクトでは、UICollectionView を使用してアイコンのグリッドを表示します。

ユーザーは、セグメント化されたコントロールをクリックして、異なる NSSortDescriptor を使用してコア データからフェッチを呼び出すことで、順序を変更できます。

データの量は常に同じで、異なるセクション/行になるだけです:

- (IBAction)sortSegmentedControlChanged:(id)sender {

   _fetchedResultsController = nil;
   _fetchedResultsController = [self newFetchResultsControllerForSort];

   NSError *error;
   if (![self.fetchedResultsController performFetch:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }

   [self.collectionView reloadData];
}

問題は、 reloadData が変更をアニメーション化せず、 UICollectionView が新しいデータでポップするだけであることです。

セルが変更前と変更後にどの indexPath にあったかを追跡し、 [self.collectionView moveItemAtIndexPath: toIndexPath:] を使用して変更のアニメーションを実行する必要がありますか、それともより良い方法がありますか?

コレクションビューのサブクラス化にはあまり興味がなかったので、助けていただければ幸いです...

ありがとう、ビル。

4

6 に答える 6

146

ラップ-reloadDataイン-performBatchUpdates:しても、1 セクションのコレクション ビューがアニメーション化されないようです。

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:nil];

ただし、このコードは機能します。

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];
于 2013-03-01T19:51:53.923 に答える
74

reloadData はアニメーション化されず、UIView アニメーション ブロックに配置された場合も確実にアニメーション化されません。UICollecitonView performBatchUpdates ブロックに入れたいので、次のようなものを試してください。

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:^(BOOL finished) {
    // do something on completion 
}];
于 2012-11-28T17:44:19.830 に答える
68

これは、すべてのセクションのリロードをアニメーション化するために行ったことです。

[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];

スイフト3

let range = Range(uncheckedBounds: (0, collectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
collectionView.reloadSections(indexSet)
于 2013-05-10T16:50:23.693 に答える
3

ブロック内のコレクション ビュー全体をリロードするperformBatchUpdates:completion:と、iOS 9 シミュレーターでグリッチ アニメーションが表示されます。UICollectionViewCell削除したい特定のものがある場合、またはそのインデックス パスがある場合はdeleteItemsAtIndexPaths:、そのブロックを呼び出すことができます。を使用deleteItemsAtIndexPaths:することで、滑らかで素敵なアニメーションを行います。

UICollectionViewCell* cellToDelete = /* ... */;
NSIndexPath* indexPathToDelete = /* ... */;

[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
    // or...
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
} completion:nil];
于 2015-09-30T10:25:58.637 に答える
1

ヘルプ テキストには次のように書かれています。

このメソッドを呼び出して、コレクション ビュー内のすべてのアイテムを再読み込みします。これにより、コレクション ビューは現在表示されているアイテムを破棄して再表示します。効率を高めるために、コレクション ビューには、表示されているセルと補足ビューのみが表示されます。リロードの結果としてコレクション データが縮小した場合、コレクション ビューはそれに応じてスクロール オフセットを調整します。項目が挿入または削除されるアニメーション ブロックの途中で、このメソッドを呼び出さないでください。挿入と削除により、テーブルのデータが自動的に適切に更新されます。

重要な部分は、「現在表示されているアイテムをコレクションビューに破棄させる」ことだと思います。破棄したアイテムの動きをどのようにアニメーション化するのでしょうか?

于 2013-04-19T18:20:46.643 に答える