Je voudrais personnaliser les styles d'animation lorsqu'un UICollectionViewCell est inséré et/ou supprimé.
La raison pour laquelle j'ai besoin de cela est que par défaut, je vois que l'insertion d'une cellule a un fondu dans l'animation, mais la suppression d'une cellule a une combinaison d'animation de déplacement vers la gauche + de fondu. J'en serais très content si ce n'était pour un problème.
Après avoir supprimé une cellule, elle est toujours réutilisée lorsque j'en ajoute de nouvelles, et lorsqu'elle est réutilisée, elle n'est pas ajoutée avec le fondu par défaut, mais à la place, c'est une combinaison de déplacement vers la gauche + de fondu.
Je ne sais pas pourquoi j'obtiens cette incohérence dans les animations. S'il s'agit d'un bug/problème/stupidité connu (de mon côté :)), veuillez me faire savoir comment le corriger.
Sinon, faites-moi savoir comment définir des animations personnalisées lorsque la cellule est supprimée (ou dirigez-moi vers un didacticiel).
Merci
MISE À JOUR
Correction du comportement d'animation étrange en sous-classant UICollectionViewFlowLayout et en ajoutant cette ligne de code
- (UICollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
return nil;
}
C'est ça! :)
Si vous utilisez votre propre sous-classe de UICollectionViewLayout
, vous pouvez implémenter les méthodes:
initialLayoutAttributesForAppearingItemAtIndexPath:
pour les insertions
finalLayoutAttributesForDisappearingItemAtIndexPath:
pour les suppressions
Selon la documentation, les attributs que vous renvoyez sont utilisés comme points de départ pour l'animation et le point final sont les attributs normaux renvoyés par votre mise en page (ou l'inverse pour la suppression). Les attributs de mise en page incluent la position, l'alpha, la transformation ... Bien sûr, il est plus difficile d'écrire votre propre classe de mise en page que d'utiliser la mise en page de flux fournie Apple fournie).
Edit: Pour répondre à votre question dans les commentaires, voici une implémentation super basique d'une mise en page pour des rangées d'éléments de même taille.
Une cellule a un frame
et, par défaut, un alpha
de 1,0 (tel que défini par layoutAttributesForItemAtIndexPath:
). Lorsqu'il est supprimé, ses propriétés seront animées de son état actuel avant la suppression vers les propriétés définies par finalLayoutAttributesForDisappearingItemAtIndexPath:
, qui correspond au même frame
et à un alpha
de 0,0. Il ne bougera donc pas, mais il disparaîtra. Cependant, les cellules de droite vont être déplacées vers la gauche (car leur indexPath
a changé, et donc leur frame
comme défini par layoutAttributesForItemAtIndexPath:
).
- (CGSize)collectionViewContentSize
{
NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0];
return CGSizeMake(numberOfItems * ITEM_WIDTH, ITEM_HEIGHT);
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSUInteger index = [indexPath indexAtPosition:0];
UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.frame = CGRectMake(index * ITEM_WIDTH, 0, ITEM_WIDTH, ITEM_HEIGHT);
return attributes;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSMutableArray *attributes = [NSMutableArray new];
NSUInteger firstIndex = floorf(CGRectGetMinX(rect) / ITEM_WIDTH);
NSUInteger lastIndex = ceilf(CGRectGetMaxX(rect) / ITEM_WIDTH);
for (NSUInteger index = firstIndex; index <= lastIndex; index++) {
NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndexes:(NSUInteger [2]){ 0, index } length:2];
[attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
}
return attributes;
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
attributes.alpha = 0.0;
return attributes;
}
Téléchargez le Disposition du cercle . Il s'agit d'un exemple de disposition personnalisée qui utilise
initialLayoutAttributesForAppearingItemAtIndexPath:
finalLayoutAttributesForDisappearingItemAtIndexPath:
Ce sera un bon matériel de travail pour vous.