Le problème ici est que la [super] mise en œuvre de l'option
- (void) setSelected:(BOOL) selected animated:(BOOL) animated;
définit toutes les couleurs d'arrière-plan dans le UITableViewCell à rgba(0,0,0,0). Pourquoi ? Peut-être pour nous donner des sueurs froides ?
Ce n'est pas que des vues entières disparaissent (comme le prouve le fait que si vous modifiez les propriétés de bordure du calque des vues, celles-ci sont conservées).
Voici la séquence d'appels de fonction qui résulte du fait de toucher une cellule
- setHighlighted
- toucheEnded
- layoutSubviews
- willSelectRowAtIndexPath (côté délégué)
- setSelected ( !!! c'est ici que toutes les couleurs d'arrière-plan de votre vue doivent disparaître)
- didSelectRowAtIndexPath (côté délégué)
- setSelected (encore) (Il est intéressant de noter que les couleurs de fond ne sont pas effacées lors de cet appel. Quelle est l'étrangeté qui se passe dans cette super méthode ?)
- layoutSubviews (encore)
Vos options sont donc les suivantes
- Remplacer - (void) setSelected :(BOOL) selected animated :(BOOL) animated ; sans appeler [super setSelected:selected animated:animated] . Cela vous donnera l'implémentation la plus correcte techniquement car a) le code est enveloppé dans la sous-classe UITableViewCell et b) parce qu'il n'est appelé qu'en cas de besoin (enfin deux fois en cas de besoin, mais il y a peut-être un moyen de contourner cela). L'inconvénient est que vous devrez réimplémenter toutes les fonctions nécessaires (par opposition aux fonctions inutiles d'effacement des couleurs) de setSelected. Ne me demandez pas encore comment remplacer correctement setSelected. Votre réponse est aussi bonne que la mienne pour le moment (soyez patient, j'éditerai cette réponse dès que j'aurai trouvé).
- Réaffirmer les couleurs de fond dans didSelectRowAtIndexPath . Ce n'est pas si génial car cela place ce qui devrait être du code d'instance en dehors de l'instance. L'avantage est qu'il n'est appelé que lorsqu'il est nécessaire, contrairement à ...
- Réaffirmer les couleurs de fond dans layoutSubviews . Ce n'est pas génial du tout car layoutSubviews est appelé des MILLIONS de fois ! Il est appelé chaque fois que la table se rafraîchit, chaque fois qu'elle défile, chaque fois que votre grand-mère obtient une permission... sérieusement, un million de fois. Cela signifie qu'il y a beaucoup de réaffirmations inutiles en arrière-plan et beaucoup de surcharge de traitement supplémentaire. Le bon côté des choses, c'est que le code est placé dans la sous-classe UITableViewCell, ce qui est agréable.
Malheureusement, la réaffirmation des couleurs d'arrière-plan dans setHighlighted ne sert à rien car setHighlighted est appelé avant que toutes les couleurs d'arrière-plan ne soient définies à [r:0 b:0 g:0 a:0] par le premier appel à setSelected.
//TODO : Donner une bonne description de la façon de remplacer setSelected (stay tuned)
0 votes
Quels autres éléments d'interface se trouvent dans la vue, qui sont couverts par la couleur de sélection des cellules ?
0 votes
Actuellement, c'est juste une image. Il est destiné à faire en sorte que l'image ressemble à une photographie. Plus tard, j'ajouterai également une étiquette.