web-dev-qa-db-fra.com

Animations UICollectionView (insérer / supprimer des éléments)

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! :)

23

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;
}
30
Guillaume

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.

6
Anil Varghese