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.
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];
}
}
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()
}
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];
}
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];
Ich habe alle zuvor beschriebenen Methoden gemischt und Code bekommen, der genau das tut, was ich will.
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()
}
}
}
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
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 ...!
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
}
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.
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.