it-swarm.com.de

Hintergrundfarbe von NSButton ändern

Ich habe einen NSButton in einer Mac-Anwendung, deren Farbe ich gerne programmatisch ändern möchte, aber nichts, was ich versucht habe, scheint zu funktionieren. Ich habe versucht, eine Ausgabe auf der NSButtonCell zu erstellen und die Hintergrundfarbe dort festzulegen, aber das hat auch nicht funktioniert. Alle Codeausschnitte wären hilfreich.

23
aleemb

Die Standard-Aqua-Tasten (Pillenform) werden vom System gezeichnet. Sie haben keine Hintergrundfarbe als solche. Tatsächlich bestehen sie aus Bildern, die Cocoa zu einem zusammenhängenden Tastenbild zusammenfügt. So kann Cocoa die Bilder nicht nach Ihren Wünschen neu einfärben. Nur die Standardschaltfläche (die mit Return als Schlüsseläquivalent gesetzt ist) hat einen blauen Hintergrund.

Was sich anhört, als würden Sie etwas tun wollen, wird die Unterklasse NSButtonCell und das eigene Zeichnen umfassen. Wenn Sie die Schaltflächenbilder neu einfärben möchten, um den gewünschten Effekt zu erzielen, können Sie mit dem ausgezeichneten Dienstprogramm Theme Park Kopien der Schaltflächenbilder von Apple extrahieren und diese verwenden. Ich gebe zu, dass ich das selbst gemacht habe, um bestimmte Elemente der Benutzeroberfläche zu "stehlen", die sonst nicht zugänglich sind, wie zum Beispiel die Scrollers von iTunes.

9
Alex

Angenommen, alles ist in IB für den randlosen Knopf angeschlossen.

// *.h file
IBOutlet NSButton* myButton;

// *.m file
[[myButton cell] setBackgroundColor:[NSColor redColor]];

Hinweis aus der setBackgroundColor Dokumentation:

Msgstr "Die Hintergrundfarbe wird nur beim Zeichnen randloser Schaltflächen verwendet."

Wenn dies für Sie nicht der Fall ist, müssen Sie NSButton überschreiben und die Zeichnung selbst implementieren.

Viel Glück.

35
Mark

Hier ist eine andere Möglichkeit, dies zu tun:

    let button = NSButton()
    button.title = ""
    button.bezelStyle = .texturedSquare
    button.isBordered = false //Important
    button.wantsLayer = true
    button.layer?.backgroundColor = NSColor.red.cgColor
9
brianLikeApple

Ich habe eine NSButton-Unterklasse mit dem Namen FlatButton erstellt, mit der sich Hintergrundfarbe, Textfarbe, Symbolfarbe, Rahmen und andere Styling-Typen sehr einfach ändern lassen.

https://github.com/OskarGroth/FlatButton

 FlatButton for macOS

5
Oskar

Marks Antwort ist richtig. Wenn Sie es jedoch mit Code tun, wird das für Sie unordentlich, wenn Sie es direkt im Interface Builder festlegen. 

  1. Suchen Sie die Schaltfläche in interfaceBuilder und klicken Sie darauf.
  2. Im Objektbrowser-Abschnitt des Schnittstellen-Generators wird angezeigt, dass die Schaltfläche, auf die Sie geklickt haben, ein Dropdown-Symbol für die Anzeige enthält. Klick es an. Es zeigt Ihnen dann die NSButtonCell der NSButton. Klick es an.
  3. Klicken Sie bei ausgewählter NSButtonCell auf den Identitätsinspektor.
  4. Suchen Sie im Identitätsinspektor nach dem Abschnitt User Defined Runtime Attributes.
  5. Klicken Sie auf das kleine Pluszeichen (+), um einen Wert hinzuzufügen. Der Wert zeigt 3 Eigenschaften an. (A) keyPath (B) Typ (C) Wert
  6. Ändern Sie den Schlüsselpfad in: backgroundColor. Ändern Sie den Typ in: Color. Ändern Sie den Wert in: Welche Farbe möchten Sie? (Eine Farbauswahl wird angezeigt)

Erledigt.

3
swift nub

In Swift kannst du das so machen:

(button.cell as! NSButtonCell).isBordered = false
(button.cell as! NSButtonCell).backgroundColor = .white
1
GuiDupas

Vielen Dank für diese großartigen Antworten. Ich habe eine NSButton-Unterklasse zusammengestellt, mit der Hintergrundfarbe, Rahmenattribute (Farbe, Breite, Ecken) und Titelattribute (Farbe, Schriftart) einfach festgelegt werden können.

Fühlen Sie sich frei zu verwenden: https://github.com/philfung/osx-dudley/blob/master/DudNSButton.Swift

0
Philip Fung

Eine Methode ist, eine Ansicht hinter der Schaltfläche zu erstellen und deren Farbe festzulegen. Dadurch wird die Ansicht mit dem gleichen Rahmen erstellt, und die Schaltfläche wird über der Ansicht angezeigt. Ich verwende ein Tag auf der Schaltfläche, um sicherzustellen, dass wir die Ansicht nur einmal hinzufügen, sodass die Methode beim Zeichnen der Benutzeroberfläche wiederholt aufgerufen werden kann.

Ich habe meinen Code zum Einstellen der Textfarbe eingefügt.

Ändern Sie die Farbe und das Alpha wie gewünscht:

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