web-dev-qa-db-fra.com

Comment puis-je personnaliser l'état de sélection de ma sous-classe UICollectionViewCell?

J'ai une sous-classe UICollectionViewCell personnalisée qui écrase initWithFrame: et layoutSubviews pour configurer ses vues. Cependant, j'essaie maintenant de faire deux choses qui me posent problème.

1) J'essaie de personnaliser l'état du UICollectionViewCell lors de la sélection. Par exemple, je veux changer l'une des images dans un UIImageView dans le UICollectionViewCell.

2) Je veux animer (rebond léger) le UIImage dans le UICollectionViewCell.

Est-ce que quelqu'un peut-il me montrer la bonne direction?

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
    [cell setSelected:YES];
}
26
user594161

Ajoutez une méthode publique performSelectionAnimations à la définition de MyCollectionViewCell qui modifie le UIImageView souhaité et exécute l'animation souhaitée. Appelez-le ensuite depuis collectionView:didSelectItemAtIndexPath:.

Donc, dans MyCollectionViewCell.m:

- (void)performSelectionAnimations {
    // Swap the UIImageView
    ...

    // Light bounce animation
    ...
}

Et dans votre UICollectionViewController:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
    [cell performSelectionAnimations];
}

Remarquez que j'ai pris l'appel à [cell setSelected:YES], car cela devrait déjà être pris en charge par UICollectionView. De la documentation:

La méthode préférée pour sélectionner la cellule et la mettre en surbrillance consiste à utiliser les méthodes de sélection de l'objet de vue de collection.

17
Jonathan

Dans votre sous-classe UICollectionViewCell personnalisée, vous pouvez remplacer le setSelected: comme suit:

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];

    if (selected) {
        [self animateSelection];
    } else {
        [self animateDeselection];
    }
}

J'ai constaté que lors de touches répétées, cette méthode est appelée sur une cellule même si elle est déjà sélectionnée, vous pouvez donc simplement vérifier que vous changez vraiment d'état avant de déclencher des animations indésirables.

57
thomh

Dans votre sous-classe UICollectionViewCell personnalisée, vous pouvez implémenter didSet sur la propriété isSelected.

Swift 3:

override var isSelected: Bool {
    didSet {
        if isSelected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}

Swift 2:

override var selected: Bool {
    didSet {
        if self.selected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}
55
Mike Sprague

Si vous souhaitez afficher une animation sur la sélection, la méthode suivante peut vous être utile:

 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
     NSLog(@"cell #%d was selected", indexPath.row);


     // animate the cell user tapped on
     UICollectionViewCell  *cell = [collectionView cellForItemAtIndexPath:indexPath];

     [UIView animateWithDuration:0.8
                           delay:0
                         options:(UIViewAnimationOptionAllowUserInteraction)
                      animations:^{
                          [cell setBackgroundColor:UIColorFromRGB(0x05668d)];
                      }
                      completion:^(BOOL finished){
                          [cell setBackgroundColor:[UIColor clearColor]];
                      }
      ];


 }
2
Gaurav

Ne devrait pas jouer avec l'état lorsqu'il est remplacé de cette manière:

override var isSelected: Bool {

    get {
        return super.isSelected
    }

    set {
        super.isSelected = newValue
        .
        .
        .
    }
}
0
Hardcoded