web-dev-qa-db-fra.com

Modification des données d'animation UICollectionView

Dans mon projet, j'utilise UICollectionView pour afficher une grille d'icônes.

L'utilisateur peut modifier l'ordre en cliquant sur un contrôle segmenté qui appelle une extraction à partir de données de base avec un NSSortDescriptor différent.

La quantité de données est toujours la même, finissant simplement dans différentes sections/lignes:

- (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];
}

Le problème est que reloadData n'anime pas le changement, UICollectionView apparaît simplement avec les nouvelles données.

Devrais-je garder trace du chemin indexPath d'une cellule avant et après modification et utiliser [self.collectionView moveItemAtIndexPath: toIndexPath:] pour effectuer l'animation en vue de la modification ou s'il existe une meilleure méthode?

Je n'ai pas beaucoup parlé de collectionViews de sous-classes, donc toute aide sera la bienvenue ...

Merci, Bill.

78
Nimrod7

reloadData n'anime pas et ne le fait pas non plus de manière fiable lorsqu'il est placé dans un bloc d'animation UIView. Il souhaite appartenir à un bloc performBatchUpdates UICollecitonView, alors essayez quelque chose de similaire à:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections[NSIndexSet indexSetWithIndex:0]];
} completion:^(BOOL finished) {}];
67
Stripes

Enveloppement -reloadData dans -performBatchUpdates: ne semble pas provoquer d'animation d'une vue de collection à une section.

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:nil];

Cependant, ce code fonctionne:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];
142
paulmelnikow

Voici ce que j'ai fait pour animer le rechargement de TOUTES LES SECTIONS:

[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];

Swift

let range = Range(uncheckedBounds: (0, collectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
collectionView.reloadSections(indexSet)
64
Yariv Nissim

Pour les utilisateurs Swift), si votre collectionview ne comporte qu'une seule section:

self.collectionView.performBatchUpdates({
                    let indexSet = IndexSet(integersIn: 0...0)
                    self.collectionView.reloadSections(indexSet)
                }, completion: nil)

Comme on le voit sur https://stackoverflow.com/a/42001389/445557

5
Gabriel Wamunyu

Si vous souhaitez plus de contrôle et une fonctionnalité personnalisable, vérifiez this , elle contient une explication très détaillée des différentes manières d’animations UICollectionViewCell.

2
RandomGuy

Rechargement de la vue de la collection entière à l'intérieur d'un performBatchUpdates:completion:bloqu fait une animation glitchy pour moi sur le simulateur iOS 9. Si vous voulez supprimer un UICollectionViewCell spécifique ou si vous avez son chemin d'index, vous pouvez appeler deleteItemsAtIndexPaths: dans ce bloc. En utilisant deleteItemsAtIndexPaths:, il fait une animation douce et agréable.

UICollectionViewCell* cellToDelete = /* ... */;
NSIndexPath* indexPathToDelete = /* ... */;

[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
    // or...
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
} completion:nil];
2
nemesis

Le texte d'aide dit:

Appelez cette méthode pour recharger tous les éléments de la vue de collection. La vue de collection supprime tous les éléments actuellement visibles et les réaffiche. Par souci d'efficacité, la vue Collection affiche uniquement les cellules et les vues supplémentaires visibles. Si les données de la collection sont réduites à la suite du rechargement, la vue de la collection ajuste ses décalages de défilement en conséquence. Vous ne devez pas appeler cette méthode au milieu de blocs d'animation où des éléments sont insérés ou supprimés. Les insertions et les suppressions entraînent automatiquement la mise à jour appropriée des données de la table.

Je pense que la partie clé est "fait en sorte que la vue de collection supprime tous les éléments actuellement visibles". Comment va-t-il animer le mouvement des objets qu’il a jetés?

1
Victor Engel