[Résolu] NSButtonCell: la transparence s'opère sur le noir.

berfisberfis Membre
octobre 2016 modifié dans API AppKit #1

Bonjour,


 


Un problème agaçant auquel je n'ai trouvé de réponse nulle part: Dans une NSTableView, je crée une colonne comprenant des cases à  cocher. Je peux appliquer une couleur de fond à  chaque ligne, et cela se passe bien tant que je ne touche pas à  la transparence.


 


Si la couleur de la ligne a un alpha < 1.0, la couleur de la cellule vire progressivement au noir autour de la case à  cocher. Si la couleur est totalement transparente, je finis par obtenir le résultat montré en pièce jointe...


 


Comment éviter le fond noir? je pense avoir tout essayé, sauf la bonne solution...


 


Réponses

  • HerveHerve Membre
    octobre 2016 modifié #2

    Si il y a une couleur avec transparence nulle, et rien derrière (ce que tu ne précises pas, mais on le devine), la classe graphique n'a rien à  afficher et cela produit du noir.


    Pourquoi veux-tu cette transparence??? Qu'y a t-il derrière à  voir? Si tu veux une couleur claire ou pastel, pourquoi ne pas la créer avec le hsb (h que tu veux, s < 0.15, b > 0.9)?


     


    PS : rappelle-toi que les classes graphiques d'un ordinateur font de la synthèse additive des couleurs, à  partir du RGB : on part du noir (tout à  zéro) pour aller vers la couleur (ou le blanc si tout est à  fond). A l'opposé, les peintres ou les imprimeurs font de la synthèse soustractive des couleurs à  partir du cyan, du magenta et du jaune (+ le noir) : on part du blanc (la lumière du jour) et on enlève de la couleur, jusqu'au noir lorsqu'on mélange tout.


  • berfisberfis Membre
    octobre 2016 modifié #3

    Bonjour Hervé,


     


    La liste peut être mise en "alternating rows" et la transparence permet de voir les lignes alternées. De plus, la couleur de fond est réutilisée sur une autre NSView (où là , la transparence fonctionne).


     


    Mon idée était de rajouter un fond blanc à  cette NSCell pour neutraliser ce fichu noir (qui doit effectivement être un nil) ou de trouver une manipulation de couleur pour obtenir un fondu au blanc au lieu d'un fondu au noir... 


     


    Si ça ne marche pas, en dernier recours, je supprimerai la possibilité de jouer avec l'alpha.


  • NSCell ne dérive pas de NSView : c'est une classe en complément si j'ose dire des contrôles à  l'écran. (un NSButton a sa NSCell qui lui est liée par exemple). Je ne suis pas certain qu'il faille colorer la NSCell (ou que l'on puisse...). Est-ce que je me trompe?

  • berfisberfis Membre
    octobre 2016 modifié #5

    NSCell a été créée pour dessiner des contrôles sans l'encombrement de NSView, probablement à  l'époque où les ressources étaient plus chiches qu'aujourd'hui. NSTableView l'a utilisée aussi, pour les mêmes raisons (actuellement, NSTableView utilise des NSViews, mais avec des astuces pour économiser la mémoire tout de même).


     


    NSCell a des capacités de dessin, dont setBackgroudColor. C'est probablement au niveau de NSButtonCell que le problème existe, puisque NSTextFieldCell s'en sort, comme le montre ma copie d'écran. Que fait celle-ci que celle-là  ne fait pas?


  • Le problème est le même : si la classe graphique n'a rien à  dessiner, cela fait du noir. (voir plus haut la synthèse additive)


  • Donc, je repose ma question dans tes termes:


    Qu'est-ce que la classe graphique NSTextFieldCell trouve à  dessiner que NSButtonCell ne trouve pas?




  • Donc, je repose ma question dans tes termes:


    Qu'est-ce que la classe graphique NSTextFieldCell trouve à  dessiner que NSButtonCell ne trouve pas?




    Posons plutôt une autre question: quelle manière utilise-tu pour mettre ta couleur de fond rouge (0...1 alpha) ? Le problème est peut être là .


  • - (void)tableView: (NSTableView *)aTableView willDisplayCell: (id)aCell forTableColumn: (NSTableColumn *)aTableColumn row: (long)rowIndex
    {
    if ([aTableView.selectedRowIndexes containsIndex:rowIndex])
    {
    [aCell setDrawsBackground: NO];
    [aCell setBackgroundColor: nil]; // This is mandatory for checkboxes.

    }
    else // unselected row
    {
    Student *student = self.studentController.arrangedObjects[rowIndex];
    [aCell setDrawsBackground: YES];
    [aCell setBackgroundColor: student.listBackColor];
    }
    }

    si on ne met pas nil à  une case à  cocher, la checkBox rate le "bleu" de la sélection de ligne sur la NSTableView.


  • Bon, finalement j'ai résolu par la force brute.


    1. Je mets l'alpha à  1.0 (couleur opaque)


    2. Je mélange la couleur résultante au blanc dans la proportion de l'alpha d'origine.



    backColor = [originalColor colorWithAlphaComponent:1.0];
    backColor = [backColor blendedColorWithFraction:1.0 - originalColor.alphaComponent ofColor:[NSColor whiteColor]]; 

    J'aurais pu jouer sur la saturation aussi, mais j'avoue avoir eu la flemme.


Connectez-vous ou Inscrivez-vous pour répondre.