J'ai un NSButton dans une application Mac dont je voudrais changer la couleur par programmation, mais rien que j'ai essayé ne semble fonctionner. J'ai essayé de créer une sortie sur le NSButtonCell et de définir la couleur d'arrière-plan, mais cela n'a pas fonctionné non plus. Tout extrait de code serait utile.
Les boutons standard Aqua (en forme de pilule) sont dessinés par le système. Ils n'ont pas de couleur de fond en tant que telle. En fait, ils sont composés d'images que Cocoa assemble pour créer une image de bouton cohérente. Donc, Cocoa ne peut pas recolorer les images à votre goût. Seul le bouton par défaut (celui avec Retour défini comme équivalent clé) aura un fond bleu clignotant.
Ce que vous voulez faire implique de sous-classer NSButtonCell
et de faire votre propre dessin. Si vous souhaitez recolorer les images des boutons pour obtenir l'effet souhaité, vous pouvez utiliser l'excellent utilitaire Theme Park / pour extraire des copies des images des boutons d'Apple et les utiliser. Je reconnais l'avoir fait moi-même afin de "voler" certains éléments d'interface qui ne sont pas autrement accessibles, tels que les défilement d'iTunes.
En supposant que tout est connecté dans IB pour votre bouton sans bordure.
// *.h file
IBOutlet NSButton* myButton;
// *.m file
[[myButton cell] setBackgroundColor:[NSColor redColor]];
Note de la documentation setBackgroundColor :
"La couleur d'arrière-plan est utilisée uniquement lors du dessin de boutons sans bordure."
Si cela ne vous convient pas, vous devrez remplacer NSButton et implémenter vous-même le dessin.
Bonne chance.
Voici une autre manière possible de faire ceci:
let button = NSButton()
button.title = ""
button.bezelStyle = .texturedSquare
button.isBordered = false //Important
button.wantsLayer = true
button.layer?.backgroundColor = NSColor.red.cgColor
J'ai créé une sous-classe NSButton
appelée FlatButton
qui permet de changer facilement la couleur d'arrière-plan, la couleur du texte, la couleur des icônes, les bordures et autres types de style de bouton, à partir d'Interface Builder:
La réponse de Mark est correcte. Mais si le faire par code vous rend compliqué, vous pouvez également le définir directement dans le générateur d’interface.
User Defined Runtime Attributes
backgroundColor
. Modifiez le type en: Color
. Changez la valeur en: quelle que soit la couleur de votre choix (un sélecteur de couleur sera affiché)Terminé.
Merci pour ces bonnes réponses. J'ai compilé une sous-classe NSButton qui facilite la définition de la couleur d'arrière-plan, des attributs de bordure (couleur, largeur, coins) et des attributs de titre (couleur, police de caractère).
N'hésitez pas à utiliser: https://github.com/philfung/osx-dudley/blob/master/DudNSButton.Swift
Une méthode consiste à créer une vue derrière le bouton et à en définir la couleur. Cela crée la vue avec le même cadre et met le bouton en haut de la vue. J'utilise une balise sur le bouton pour m'assurer que nous ajoutons la vue une seule fois, afin que la méthode puisse être appelée à plusieurs reprises lors du dessin de l'interface utilisateur.
J'ai inclus mon code pour définir la couleur du texte.
Changez la couleur et l'alpha comme vous le souhaitez:
NSColor *colour = [NSColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.5] ;
[self styleButton:button colour:colour] ;
-(void) styleButton:(NSButton *)button colour:(NSColor *)colour {
[self setButton:button fontColor:[NSColor whiteColor]];
if(button.tag == 9901) return ;
button.bezelStyle = NSBezelStyleTexturedSquare ;
[button setBordered:NO];
NSView *b2 = [[NSView alloc] initWithFrame:button.frame] ;
[button.superview addSubview:b2] ;
b2.layer.backgroundColor = colour.CGColor;
[button removeFromSuperview];
[b2.superview addSubview:button];
button.tag = 9901 ;
}
-(void) setButton:(NSButton *)button fontColor:(NSColor *)color {
NSMutableAttributedString *colorTitle = [[NSMutableAttributedString alloc] initWithAttributedString:[button attributedTitle]];
[colorTitle addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, button.attributedTitle.length)];
[button setAttributedTitle:colorTitle];
}