デフォルトのFlowLayout、独自のセクションなど、すべての基本的なものでコレクションビューを作成しています。
私が正しく使用していると仮定するとcollectionView:CellForItemAtIndexPath:
、他のすべてのdataSource
プロトコル
はmainData
、辞書の配列 (元のデータ) でありmainDataReferenceOrdered
、(同じ要素が指している) と同じデータを含む他の配列です。順序付けられたデータへのコントローラーの現在の配列ポインターです。mainDataNameOrdered
mainDataQuantiteOrdered
mainData
dataToDisplay
並べ替えるときは、次のように、コレクション ビュー バッチでデータを変更するだけです。
[itemCollectionControl.collectionView performBatchUpdates:^{
dataToDisplay = mainDataReferenceOrdered; //or any other ordered array
[itemCollectionControl.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, itemCollectionControl.collectionView.numberOfSections)]];
} completion:^(BOOL finished) {}];
ただし、コレクションは、既に表示されている場合や適切な場所にある場合でも、すべてのセルをフェードします。
UICollectionView に関する Apple のドキュメントを読みましたが、何を見逃したのかわかりません。私はそれについて他のスレッドも読みましたが、どうすればいいのかまだ探しています。
セルに適用するアニメーションを知るために、バッチは何を見ますか?
私の解決策
これは私が使用する最終的なコードであり、私が推測する iOS プログラミング ガイドラインに最も近いものです。
[itemCollectionControl.collectionView performBatchUpdates:^{
NSArray *oldOrder = dataToDisplay;
dataToDisplay = mainDataNBContainersOrdered;
for (NSInteger i = 0; i < oldOrder.count; i++) {
NSIndexPath *fromIndexPath = [NSIndexPath indexPathForRow:i inSection:0];
NSInteger j = [dataToDisplay indexOfObject:oldOrder[i]];
NSIndexPath *toIndexPath = [NSIndexPath indexPathForRow:j inSection:0];
[itemCollectionControl.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];
}
} completion:^(BOOL finished) {
if (finished) {
[itemCollectionControl.collectionView reloadData];
}
}];
古い注文アイテムをすべてブラウズし、それらの新しい位置を確認し、それを適用する-[UICollectionView moveItemAtIndexPath:toIndexPath:]
だけです 補完は iOS7 では役に立たないかもしれません。iOS6 シャッフルの最後に正しい順序を強制します。
編集
解決策を見つけたと思いますが、そのプロジェクトでテストすることはできなくなりました。おそらく、2 行のコードを追加するだけで、このひどい不具合が修正されるはずです。
の呼び出しの前に-[UICollectionView moveItemAtIndexPath:toIndexPath:]
、呼び出し-[UICollectionView beginUpdates]
、そして最後にすべての動きの後-[UICollectionView endUpdates]
。
テストできる人で動作することがわかった場合は、教えてください。