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