En mi proyecto, uso UICollectionView para mostrar una cuadrícula de iconos.
El usuario puede cambiar el orden haciendo clic en un control segmentado que solicita una recuperación de los datos centrales con diferentes NSSortDescriptor.
La cantidad de datos es siempre la misma, solo termina en diferentes secciones / filas:
- (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];
}
El problema es que reloadData no anima el cambio, UICollectionView simplemente aparece con los nuevos datos.
¿Debo realizar un seguimiento de en qué indexPath estaba una celda antes y después del cambio y usar [self.collectionView moveItemAtIndexPath: toIndexPath:] para realizar la animación del cambio o hay un método mejor?
No me interesé mucho en la subclasificación de collectionViews, por lo que cualquier ayuda será excelente ...
Gracias, Bill.
fuente
reloadData
llamada en un bloque de animación?Respuestas:
reloadData no se anima, ni tampoco lo hace de forma fiable cuando se coloca en un bloque de animación UIView. Quiere estar en un bloque UICollecitonView performBatchUpdates, así que intente algo más como:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:^(BOOL finished) { // do something on completion }];
fuente
-reloadSections:
hace que funcione.Envolver
-reloadData
en-performBatchUpdates:
no parece causar una vista de colección de una sola sección para animar.[self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:nil];
Sin embargo, este código funciona:
[self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];
fuente
self.collectionView performBatchUpdates
llamada envueltareloadSections
para obtener la animación. De hecho, laperformBatchUpdates
llamada puede causar problemas inadvertidos de parpadeo / cambio de tamaño de celda en algunos casos.[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
reloadSections
en la vista de colección o en la vista de tabla lo hará con animación.Esto es lo que hice para animar la recarga de TODAS LAS SECCIONES:
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];
Swift 3
let range = Range(uncheckedBounds: (0, collectionView.numberOfSections)) let indexSet = IndexSet(integersIn: range) collectionView.reloadSections(indexSet)
fuente
Para los usuarios de Swift, si su vista de colección solo tiene una sección:
self.collectionView.performBatchUpdates({ let indexSet = IndexSet(integersIn: 0...0) self.collectionView.reloadSections(indexSet) }, completion: nil)
Como se ve en https://stackoverflow.com/a/42001389/4455570
fuente
Recargar la vista de la colección completa dentro de un
performBatchUpdates:completion:
bloque produce una animación con fallas para mí en el simulador de iOS 9. Si tiene un específicoUICollectionViewCell
que desea eliminar, o si tiene su ruta de índice, puede llamardeleteItemsAtIndexPaths:
a ese bloque. Al usarlodeleteItemsAtIndexPaths:
, hace una animación suave y agradable.UICollectionViewCell* cellToDelete = /* ... */; NSIndexPath* indexPathToDelete = /* ... */; [self.collectionView performBatchUpdates:^{ [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]]; // or... [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; } completion:nil];
fuente
El texto de ayuda dice:
Creo que la parte clave es "hace que la vista de colección descarte cualquier elemento actualmente visible". ¿Cómo va a animar el movimiento de los elementos que ha descartado?
fuente