UIView backgroundColor disparaît lorsque UITableViewCell est sélectionné
J'ai un simple tableViewCell construire dans interface builder.
Il contient une UIView qui contient une image.
Maintenant, lorsque je sélectionne la cellule, le bleu par défaut sélection d'arrière-plan est affichée mais le backgroundColor de mon UIView est allé.
Mon UITableViewCell mise en œuvre du fichier ne veut pas faire quelque chose de spécial. Il vient d'init & renvoie de soi et de tout ce que je fais dans setSelected est d'appeler super.
Comment puis-je obtenir mon UIView backgroundColor à afficher lors de la tableView est sélectionné?
- Quels sont les autres éléments de l'interface sont à l'intérieur de la vue, couverts par la cellule de sélection de couleur?
- Actuellement C'est juste une image. Il est destiné à rendre l'image comme une photo. Plus tard, je vais être en ajoutant une étiquette sur il ainsi.
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que le [super] la mise en œuvre de
définit toutes les couleurs d'arrière-plan dans le UITableViewCell à rgba(0,0,0,0). Pourquoi? Peut-être pour faire de nous tous de la sueur?
Il n'est pas l'ensemble des vues disparaître (comme en témoigne le fait que si vous modifiez le point de vue de la couche de propriétés de bordure, ceux-ci sont conservés)
Voici la séquence d'appels de la fonction de résultats à partir de toucher une cellule
Afin que vos options sont à
Malheureusement ré-affirmer les couleurs d'arrière-plan dans setHighlighted ne fait rien car setHighlighted est appelé avant que toutes les couleurs d'arrière-plan préparez-vous à [r:0 b:0 g:0 a:0] par le premier appel à setSelected.
//TODO: Donne une description de la façon de substituer setSelected (restez à l'écoute)
selectionStyle
àUITableViewCellSelectionStyleNone
, et il ne sera pas effacer les milieux. Le seul inconvénient est qu'il ignore leselectedBackgroundView
de la propriété.setHighlighted
ont mieux fonctionné pour moiAuparavant, j'ai fait comme @P5ycH0 dit (1x1 image étirée), mais en suivant @Brooks, j'ai pensé qu'primordial
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
dans mon customUITableViewCell
mise en œuvre et la réinitialisation de la les couleurs d'arrière-plan après l'appel de[super setHighlighted:highlighted animated:animated];
garde mes couleurs d'arrière-plan lorsque la cellule est sélectionnée/a soulignésetHighlighted
fonction est créée pour ajouter des comportements quand la cellule est sélectionnée, btw, bon travailLorsque votre
UITableViewCell
est sélectionné, il y a deux états, vous devriez prêter attention à:Highlighted
etSelected
.Donc, pour les scénarios que vous avez une cellule personnalisé de classe qui est sous-classe de
UITableViewCell
, vous pouvez facilement remplacer ces deux méthodes afin d'éviter cette situation(Swift):Brooks a une bonne explication de pourquoi cela arrive, mais je pense que j'ai une meilleure solution.
Dans votre sous-vue, remplacer
setBackgroundColor:
à ce que jamais la couleur que vous voulez. Le compositeur s'appelle toujours, mais seulement votre couleur spécifiée sera appliquée.Ok, perdre la couleur d'arrière-plan d'une classe UIView comportement est normal lorsque ses, dans un tableviewcell.
Je ne pouvais pas comprendre comment l'en empêcher.
Maintenant, j'ai juste remplacé le UIView avec une UIImageView contenant un tendu de 1x1 pixel blanc.
Laid de l'omi, mais il fonctionne.
Vous devez remplacer les deux méthodes dans votre cellule personnalisé:
Noter que:
[super setSelected:animated:]
et[super setHighlighted:animated:]
dans le début de votre coutume de mise en œuvre ou correspondent à des méthodesUITableViewCellSelectionStyleNone
selectionStyle pour la réalisation de votre cellule, de désactiver tout défautUITableViewCell
style;Ici l'exemple de la mise en œuvre:
La
contentView
est la propriété deUITableViewCell
qui est apparu dans iOS 7. Notez que vous pouvez utiliser vos propres cellules de l'enfant ou les vues au lieu de cela.Ce problème peut (enfin) être résolu dans iOS 13. Trouvé ce doux alinéa de l'iOS 13 beta 3 notes de version.
https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_beta_3_release_notes
Ajouter à votre UITableViewCell
Liées à @Brooks réponse, c'est ce que j'ai fait pour le faire fonctionner dans Swift et iOS8/iOS9.
setSelected
etsetHighlighted
contentView.backgroundColor
, parce qu'il n'a pas à s'étendre sur toute la largeur de la cellule (c'est à dire des accessoires).Utiliser le
backgroundColor
de la cellule elle-même, et de régler en conséquence.Résumé
Cette solution vous permet de verrouiller certaines d'une cellule de couleurs d'arrière-plan, tandis que le reste sont contrôlés par le comportement d'un système.
Basé sur mientus' réponse, j'ai créé une solution qui vous permet de spécifier les points de vue doivent garder leur couleur d'arrière-plan.
Cela permet encore une autre cellule sous-vues pour avoir leur arrière-plan retiré sur la mise en valeur/sélection, et est la seule solution qui fonctionne dans notre cas (deux points de vue, d'avoir besoin d'un fond sonore permanent).
J'ai utilisé un protocole approche orientée, avec une
BackgroundLockable
protocole contenant la liste des vues de verrouillage, et l'exécution d'une fermeture tout en gardant les couleurs:Puis j'ai une sous-classe de
UITableViewCell
, qui remplace les mettre en évidence et de sélection pour exécuter le protocole de fermeture autour de l'appel de la valeur par défaut (super) comportement:Maintenant j'ai juste à la sous-classe
LockableBackgroundTableViewCell
ou utiliser leBackgroundLockable
protocole dans une cellule de la classe d'ajouter facilement de verrouillage comportement de certaines cellules!Swift 4
Dans votre UITableViewCell classe:
À partir de ce que vous avez dit que vous avez construit une tableViewCell à l'aide de l'IB, je tiens à le consulter si vous ajoutez à votre vue comme une sous-vue de
contentView
de UITableViewCell, pasview
. L'affichage du contenu est la valeur par défaut superview pour le contenu affiché par la cellule.À partir de la référence:
Vous pouvez modifier le comportement de la tableViewCell par substitution de la fonction setHighlighted dans UITableViewCell classe (vous aurez besoin d'hériter de lui). Exemple de mon code où je changer l'image de fond de ma cellule :
Vous pouvez également modifier le mode de sélection de gris, de bleu ou de aucun dans interface builder.
Dans iOS 7, ce qui a fonctionné pour moi est de remplacer
setSelected:animated:
dans leUITableViewCell
sous-classe, mais contrairement à @Brooks' astuce, j'ai appelé[super setSelected:selected animated:animated]
.Cela me permet de garder le système de sélection par défaut de l'animation lorsque l'utilisateur appuie sur la cellule, et aussi pour le désélectionner dans la vue table du délégué
didSelectRowAtIndexPath:
.Juste passé un peu de temps sur cette étrange question. Je n'ai pas envie de mettre UITableViewCellSelectionStyleNone style pour préserver belle animation quand ma ligne a été activée. Mais aucun des idées suggérées travaillé pour moi - j'ai essayé de remplacer setSelected et setHighlighted et mis mes sous-vue backgroundColor, il y a maintien de la réinitialisation par iOS et continuent à clignoter (nouvelle couleur -> couleur vieux).
Pour moi la solution était assez simple.
Quand ma ligne est sélectionnée un autre point de vue contrôleur est enfoncé, l'utilisateur choisit une option sur l'écran et délégué est appelé lorsque j'ai changer de couleur en fonction de la sélection de l'utilisateur. Dans ce délégué je viens de faire [de la cellule setSelected:NON animation:NON] pour ma cellule. (J'ai statique UITableViewController et ont des points de vente pour les cellules).
Vous pourriez probablement désélectionner cellule dans didSelect méthode, mais dans mon cas, je suis en utilisant enchaîne.
Voici mon prendre sur elle. J'ai une sous-classe que toutes mes cellules hériter de, de sorte que la façon dont je le fais pour éviter le changement d'arrière-plan dans mon UIImageViews:
Ce automaticlly corriger le problème pour tous les
UIImageView
.