Où en évidence UICollectionViewCell: délégué ou de la cellule?
Selon la Vue De Collection Guide De Programmation on doit gérer l'état visuel de la cellule en surbrillance dans la UICollectionViewDelegate
. Comme ceci:
- (void)collectionView:(PSUICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
MYCollectionViewCell *cell = (MYCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
[cell highlight];
}
- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
MYCollectionViewCell *cell = (MYCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
[cell unhighlight];
}
Ce que je n'aime pas à propos de cette approche est qu'il ajoute une logique à l'délégué qui est très spécifique à la cellule. En fait, UICollectionViewCell
gère son surbrillance de manière indépendante, par l'intermédiaire du highlighted
propriété.
Ne serait pas primordial setHighlighted:
être une solution plus propre, alors?
- (void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
if (highlighted) {
[self highlight];
} else {
[self unhighlight];
}
}
Qu'il ya des inconvénients à cette approche au lieu de la déléguer approche?
Vous devez vous connecter pour publier un commentaire.
Que dit la documentation, vous pouvez compter sur
highlighted
propriété d'être changé lorsque la cellule est mise en surbrillance. Par exemple, le code suivant va faire de la cellule en rouge lorsque mis en évidence (pas de son sous-vues tout de même):Et si vous ajouter quelque chose comme cela, le fond sera devenu violet (rouge + bleu opaque):
De sorte que vous pouvez utiliser les deux ensemble (pas nécessairement par le changement de l'apparence des cellules). La différence est que, avec le délégué méthodes vous avez également
indexPath
. Il peut être utilisé pour créer des multi-sélection (vous pourrez utiliser ces méthodes avec la sélection délégué méthodes), pour montrer certains aperçu alors que la cellule est en surbrillance, pour montrer un peu d'animation avec d'autres points de vue... Il y a assez peu de l'appliance pour cette délégué à des méthodes, à mon avis.En conclusion, je voudrais laisser la cellule apparence d'être traitées par la cellule elle-même et l'utilisation délégué méthodes de laisser contrôleur de faire quelque chose de cool en même temps.
setNeedsDisplay
+drawRect
approche. Peut-être que je voudrais vérifier siself.highlighted != highlighted
(sur la ligne 1) avant d'appelersetNeedsDisplay
, de façon à éviter le dessin.drawRect
etsetNeedsDisplay
des appels lors de la substitutionsetHighlighted:
. Cela va faire:self.contentView.backgroundColor = highlighted ? UIColor(white: 217.0/255.0, alpha: 1.0) : nil
Deux approches possibles sont décrites ci-dessous.
Cellulaire Sous-Classement
Plus propre approche, s'il est déjà sous-classement de
UICollectionViewCell
.UICollectionViewDelegate
Moins propre, nécessite la collecte de vue déléguer à savoir à propos de la logique de présentation des cellules.
Bien...que toutes ces méthodes sont correctes. J'ai trouvé la voie qui semble la plus facile pour moi. Juste remplacer le setSelected: méthode (par exemple pour changer la couleur d'arrière-plan):
...il fonctionne "out of the box" (même avec collectionView.allowsMultipleSelection)
Avis que
UICollectionViewCell
a unselectedBackgroundView
de la propriété. Par défaut, c'est nul. Il suffit de créer une vue pour cette propriété, et il apparaîtra lorsque l'utilisateur touche la cellule.delaysContentTouches
problèmes.C'est assez pour la mise en évidence de cellules (Swift 4)
Comme prises directement à partir de UICollectionViewCell.h - primordial à la fois
setSelected
etsetHighlighted
sont corrects. Selon votre situation, vous pourriez envisager de confier des vues personnalisées pourbackgroundView
etselectedBackgroundView
qui sont permutées automatiquement lors de la sélection.Swift 3: (à partir de la réponse d'Un-Live)
Swift 4