を使用しUICollectionView
て、フィールド上のさまざまな位置にいるプレーヤーを表示しています。各セルには、プレーヤーの名前とポジション名を示すラベルが含まれています。ビュー内の位置は、データ ソースから位置情報を読み取るカスタム レイアウトによって決定されます。つまり、フロー レイアウトのように、フィールド上の位置はデータ ソース内のインデックスとは関係ありません。セルもさまざまな位置で少し異なります...「cellForItemAtIndexPath」は、位置に応じてさまざまな再利用識別子から選択します。
ユーザーがポジションのプレーヤーを交換できるようにしたい。コレクション ビューのデータ ソースを更新して を呼び出すだけで、すべてが完全に機能します[self.collectionView reloadData]
。しかし、ユーザーが変更を確認できるように、セルのスワップをアニメーション化したいと考えています。私はこのコードを使用しています.inboundSourceIndexとoutboundSourceIndexは以前にスワップしているアイテムに設定されています:
[self.collectionView performBatchUpdates:^{
[self.collectionView moveItemAtIndexPath:inboundOriginIndex toIndexPath:outboundOriginIndex];
[self.collectionView moveItemAtIndexPath:outboundOriginIndex toIndexPath:inboundOriginIndex];
} completion:nil];
}
[self assignmentsUpdate]; // This method updates the data source for the collection view
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView reloadData];
バッチ更新を挿入した後、セルが互いに入れ替わるように見える目的のアニメーションを取得し、プレーヤー名ラベルが正しく表示され、レイアウトがセルに適切なフレームを提供します (これは異なる場合があります)。しかし、それ以外はすべて混沌としています。位置ラベルは更新されず、セルは正しい再利用識別子でリロードされません。これは、collectionView が実際にはcellForItemAtIndexPath
. データの更新と reloadData の順序を変更しようとしましたが、役に立ちませんでした。セルを移動すると indexPaths が一時的に変更される可能性があることはわかりますが、invalidateLayout
andを呼び出した後、collectionView がどのように間違って見えるのreloadData
でしょうか? それは、データ ソースに基づいてゼロからビューを構築することではありませんか?