web-dev-qa-db-fra.com

Changer la couleur de fond de NSButton

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.

23
aleemb

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.

9
Alex

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.

35
Mark

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
9
brianLikeApple

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:

https://github.com/OskarGroth/FlatButton

 FlatButton for macOS

5
Oskar

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. 

  1. Recherchez le bouton dans interfaceBuilder et cliquez dessus.
  2. Dans la section du navigateur d’objets du générateur d’interface, le bouton sur lequel vous avez cliqué comporte une icône de liste déroulante. Clique dessus. Il vous montrera ensuite le NSButtonCell du NSButton. Clique dessus.
  3. Avec le NSButtonCell sélectionné, cliquez sur l'inspecteur d'identité.
  4. Dans l'inspecteur d'identité, recherchez la section intitulée User Defined Runtime Attributes
  5. Cliquez sur le petit signe plus (+) pour ajouter une valeur. La valeur montrera avoir 3 propriétés. (A) keyPath (B) Type (C) Valeur
  6. Modifiez le keyPath en: 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é.

3
swift nub

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

0
Philip Fung

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];
}
0
A.Badger