7

を使用し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 が一時的に変更される可能性があることはわかりますが、invalidateLayoutandを呼び出した後、collectionView がどのように間違って見えるのreloadDataでしょうか? それは、データ ソースに基づいてゼロからビューを構築することではありませんか?

4

0 に答える 0