W moim projekcie używam UICollectionView do wyświetlania siatki ikon.
Użytkownik może zmienić kolejność, klikając podzieloną na segmenty kontrolkę, która wywołuje pobieranie z danych podstawowych za pomocą innego NSSortDescriptor.
Ilość danych jest zawsze taka sama, po prostu znajdują się w różnych sekcjach / wierszach:
- (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];
}
Problem polega na tym, że reloadData nie animuje zmiany, UICollectionView po prostu wyskakuje z nowymi danymi.
Czy powinienem śledzić, w którym indexPath komórka była przed i po zmianie, i użyć [self.collectionView moveItemAtIndexPath: toIndexPath:], aby wykonać animację zmiany, czy jest lepsza metoda?
Nie interesowałem się zbytnio podklasą collectionViews, więc każda pomoc będzie świetna ...
Dzięki, Bill.
ios
uicollectionview
Nimrod7
źródło
źródło
reloadData
wywołanie w blok animacji?Odpowiedzi:
reloadData nie animuje, ani nie robi tego niezawodnie po umieszczeniu w bloku animacji UIView. Chce być w bloku performBatchUpdates UICollecitonView, więc spróbuj czegoś więcej na przykład:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:^(BOOL finished) { // do something on completion }];
źródło
-reloadSections:
sprawia, że to działa.Zawijanie
-reloadData
w-performBatchUpdates:
nie wydaje się, aby spowodować jeden punkt zbiórki widok animować.[self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:nil];
Jednak ten kod działa:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];
źródło
self.collectionView performBatchUpdates
zawiniętego połączenia,reloadSections
aby uzyskać animację. W rzeczywistościperformBatchUpdates
wywołanie może w niektórych przypadkach powodować nieumyślne migotanie / problemy ze zmianą rozmiaru komórki.[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
reloadSections
w widoku kolekcji lub widoku tabeli zrobi to z animacją.Oto, co zrobiłem, aby ożywić ponowne załadowanie WSZYSTKICH SEKCJI:
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];
Szybki 3
let range = Range(uncheckedBounds: (0, collectionView.numberOfSections)) let indexSet = IndexSet(integersIn: range) collectionView.reloadSections(indexSet)
źródło
W przypadku użytkowników Swift, jeśli widok kolekcji ma tylko jedną sekcję:
self.collectionView.performBatchUpdates({ let indexSet = IndexSet(integersIn: 0...0) self.collectionView.reloadSections(indexSet) }, completion: nil)
Jak widać na https://stackoverflow.com/a/42001389/4455570
źródło
Ponowne załadowanie całego widoku kolekcji wewnątrz
performBatchUpdates:completion:
bloku powoduje wyświetlenie dla mnie animacji na symulatorze iOS 9. Jeśli masz konkretny element,UICollectionViewCell
który chcesz usunąć, lub jeśli masz jego ścieżkę indeksu, możesz wywołaćdeleteItemsAtIndexPaths:
w tym bloku. UżywającdeleteItemsAtIndexPaths:
, tworzy płynną i ładną animację.UICollectionViewCell* cellToDelete = /* ... */; NSIndexPath* indexPathToDelete = /* ... */; [self.collectionView performBatchUpdates:^{ [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]]; // or... [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; } completion:nil];
źródło
Tekst pomocy mówi:
Myślę, że kluczową częścią jest „powoduje, że widok kolekcji odrzuca wszystkie aktualnie widoczne elementy”. Jak ma ożywić ruch odrzuconych przedmiotów?
źródło