In meinem Projekt verwende ich UICollectionView, um ein Raster von Symbolen anzuzeigen.
Der Benutzer kann die Reihenfolge ändern, indem er auf ein segmentiertes Steuerelement klickt, das einen Abruf von Kerndaten mit einem anderen NSSortDescriptor aufruft.
Die Datenmenge ist immer gleich und endet nur in verschiedenen Abschnitten / Zeilen:
- (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];
}
Das Problem ist, dass reloadData die Änderung nicht animiert, UICollectionView nur mit den neuen Daten angezeigt wird.
Sollte ich verfolgen, in welchem Indexpfad sich eine Zelle vor und nach der Änderung befand, und [self.collectionView moveItemAtIndexPath: toIndexPath:] verwenden, um die Animation für die Änderung auszuführen, oder gibt es eine bessere Methode?
Ich habe mich nicht viel mit dem Unterklassen von collectionViews beschäftigt, daher ist jede Hilfe großartig ...
Danke, Bill.
quelle
reloadData
Aufruf in einen Animationsblock zu packen?Antworten:
reloadData animiert nicht und tut dies auch nicht zuverlässig, wenn es in einen UIView-Animationsblock eingefügt wird. Es möchte sich in einem UICollecitonView performBatchUpdates-Block befinden. Versuchen Sie also etwas wie:
quelle
-reloadSections:
funktioniert es.Wrapping
-reloadData
in-performBatchUpdates:
scheint nicht zu einem Ein-Abschnitt Sammlung Blick auf belebter zu verursachen.Dieser Code funktioniert jedoch:
quelle
self.collectionView performBatchUpdates
Anruf nicht benötigenreloadSections
, um die Animation zu erhalten. Tatsächlich kann derperformBatchUpdates
Anruf in einigen Fällen zu versehentlichem Flackern / zur Größenänderung von Zellen führen.[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
reloadSections
in der Sammlungsansicht oder Tabellenansicht mit Animation.Dies ist, was ich getan habe, um das Nachladen ALLER ABSCHNITTE zu animieren:
Swift 3
quelle
Für Swift-Benutzer, wenn Ihre Sammlungsansicht nur einen Abschnitt enthält:
Wie unter https://stackoverflow.com/a/42001389/4455570 zu sehen
quelle
Das Neuladen der gesamten Sammlungsansicht innerhalb eines
performBatchUpdates:completion:
Blocks führt für mich auf dem iOS 9-Simulator zu einer fehlerhaften Animation. Wenn Sie ein bestimmtesUICollectionViewCell
Element haben, das Sie löschen möchten, oder wenn Sie dessen Indexpfad haben, können SiedeleteItemsAtIndexPaths:
diesen Block aufrufen . Durch die VerwendungdeleteItemsAtIndexPaths:
wird eine reibungslose und schöne Animation erstellt.quelle
Der Hilfetext sagt:
Ich denke, der Schlüsselteil ist "bewirkt, dass die Sammlungsansicht alle derzeit sichtbaren Elemente verwirft". Wie wird es die Bewegung von Gegenständen animieren, die es weggeworfen hat?
quelle