wake-up-neo.com

Ändern Sie die Auswahlfarbe für das View-basierte NSTableView

Die Standardfarbe für die Hervorhebung in OS X-Anwendungen ist blau.

Ist es möglich, sie in eine andere Farbe zu ändern, z. grau?

Beachten Sie, dass ich die neue ansichtsbasierte NSTableView benutze, die ab OS X 10.7 verfügbar ist.

41
Dev

Da Sie das View-basierte NSTableView verwenden, können Sie die NSTableRowView-Klasse subclassieren, sie der Tabellen-Delegat-Methode - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row; zuführen und dann Ihre Auswahl in der Zeilenansichtenklasse anpassen.

Hier ist ein Beispiel:

- (void)drawSelectionInRect:(NSRect)dirtyRect {
    if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) {
        NSRect selectionRect = NSInsetRect(self.bounds, 2.5, 2.5);
        [[NSColor colorWithCalibratedWhite:.65 alpha:1.0] setStroke];
        [[NSColor colorWithCalibratedWhite:.82 alpha:1.0] setFill];
        NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect xRadius:6 yRadius:6];
        [selectionPath fill];
        [selectionPath stroke];
    }
}
74
James Chen

Hier ist die Lösung von James Chen in Swift 3. Ich habe auch die Delegat-Methode hinzugefügt.

class MyNSTableRowView: NSTableRowView {

    override func drawSelection(in dirtyRect: NSRect) {
        if self.selectionHighlightStyle != .none {
            let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
            NSColor(calibratedWhite: 0.65, alpha: 1).setStroke()
            NSColor(calibratedWhite: 0.82, alpha: 1).setFill()
            let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 6, yRadius: 6)
            selectionPath.fill()
            selectionPath.stroke()
        }
    }
}

NSTableViewDelegate:

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    return MyNSTableRowView()
}
13
Felix

Verwenden Sie den folgenden Code als Antwort auf das NSTableViewDelegate-Protokoll tableViewSelectionDidChange:

Rufen Sie die Variable NSTableRowView für die ausgewählte Zeile ab und rufen Sie die Methode setEmphasized auf. Wenn setEmphasized auf YES gesetzt ist, wird die blaue Markierung angezeigt, bei NEIN die graue Markierung. 

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {

     NSInteger selectedRow = [myTableView selectedRow];
     NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
     [myRowView setEmphasized:NO];
}
12
Jean-Pierre

Einige Änderungen an Jean-Pierre answer

Verwenden Sie den folgenden Code als Antwort auf das NSTableViewDelegate-Protokoll tableViewSelectionDidChange:

Rufen Sie die NSTableRowView für die ausgewählte Zeile ab und rufen Sie die Methode setEmphasized auf. Wenn setEmphasized auf YES gesetzt ist, wird die blaue Markierung angezeigt, bei NEIN die graue Markierung.

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {

 NSInteger selectedRow = [myTableView selectedRow];
 NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular];
[myRowView setEmphasized:NO];
}

Und um den Tanzeffekt von Blau und dann Grau zu vermeiden 

[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
6
Utkarsha

Ich habe alle zuvor beschriebenen Methoden gemischt und Code bekommen, der genau das tut, was ich will.

  • Auswahlfarbe ändert die Farbe der Textfelder nicht;
  • Die Zeilen erinnern sich an Auswahl und Farbe von einem;
  • Alle seltsamen äußeren Ränder und andere Reste erscheinen.

    class AudioCellView: NSTableRowView {
    
        override func draw(_ dirtyRect: NSRect) {
            super.draw(dirtyRect)
            self.wantsLayer = true
            self.layer?.backgroundColor = NSColor.white.cgColor
        }
    
        override var isEmphasized: Bool {
            set {}
            get {
                return false
            }
        }
    
        override var selectionHighlightStyle: NSTableView.SelectionHighlightStyle {
            set {}
            get {
                return .regular
            }
        }
    
        override func drawSelection(in dirtyRect: NSRect) {
            if self.selectionHighlightStyle != .none {
                let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
                NSColor(calibratedWhite: 0.85, alpha: 0.6).setFill()
                let selectionPath = NSBezierPath.init(rect: selectionRect)
                selectionPath.fill()
            }
        }
    }
    
2
dimazava

Wenn Sie Swift verwenden, können Sie dies am 10.10 für View-basierte Zellen tun

Unterklasse die NSTableCellView und implementiere das:

//override to change background color on highlight
override var backgroundStyle:NSBackgroundStyle{
    //check value when the style was setted
    didSet{
        //if it is dark the cell is highlighted -> apply the app color to it
        if backgroundStyle == .Dark{
            self.layer!.backgroundColor = yourColor
        }
        //else go back to the standard color
        else{
            self.layer!.backgroundColor = NSColor.clearColor().CGColor
        }
    }
}

Beachten Sie, dass der Hervorhebungsstil NSTableView auf Regular gesetzt sein muss. Wenn er auf SourceList gesetzt ist, wird dies zu seltsamen Ausschnitten führen.

Dies ist nicht die sauberste Lösung, funktioniert aber auf Yosemite gut 

2
arnoapp

Es scheint mir, dass es eine Option gibt, um diese Coz zu ändern. Die Dokumentation sagt drei Auswahlstile aus und der Standardstil in Standard ist blau. Schauen Sie sich das Bild unten an Ich habe noch nie Apps für Mac entwickelt ... hoffentlich hilft das ...!

enter image description here

1

Wie bereits erwähnt, setzen Sie das hervorgehobene Attribut auf "false", tun Sie dies jedoch in der benutzerdefinierten NSTableRowView-Klasse, um Nebenwirkungen (wie den Effekt der tanzenden Farbe) zu vermeiden:

    override func drawRect(dirtyRect: NSRect) {
       super.drawRect(dirtyRect)
       self.emphasized = false

    }
1
Lubos

Sie müssen NSTableView in die Unterklasse unterteilen und die folgenden Funktionen neu schreiben, um die abwechselnden Farben zu ändern.

  • (void) drawRow: (NSInteger) row clipRect: (NSRect) clipRect

  • (void) drawBackgroundInClipRect: (NSRect) clipRect ** Hier können Sie die Haupt- und Alternativfarbe ändern **

Verwenden Sie eine for-Schleife und fügen Sie diesen Bedingungscode (i % 2 == 0) ein, um ungerade und gerade Zeilen zu ermitteln.

0
Julian

Okay, ich weiß also, dass es bereits eine akzeptierte Antwort hat, aber für jeden, der mit einer NSOutlineView arbeitet und .selectionHighlightStyle = .sourceList hat, kann dieser Code verwendet werden, um die Auswahl grau zu machen. Diese Methode flackert beim Ändern der Auswahl nicht und bleibt auch grau, wenn die App minimiert wird.

NSTableView/NSOutlineView-Delegat:

func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView?
{
     let row : CustomRowView = CustomRowView.init()
     row.identifier = "row"

     return row
}

Erstellen Sie dann eine neue CustomRowView.Swift-Datei mit folgendem Inhalt:

class CustomRowView : NSTableRowView
{
    override var isEmphasized: Bool {
        get { return self.isEmphasized }
        set(isEmp) { self.isEmphasized = false }
    }
}

Dadurch bleibt die Auswahl immer grau.

0
Silicone