Стандартный цвет подсветки в приложениях OS X - синий.
Можно ли изменить его на другой цвет, например. серый?
Обратите внимание, что я использую новый NSTableView
на основе представления, начиная с OS X 10.7.
Стандартный цвет подсветки в приложениях OS X - синий.
Можно ли изменить его на другой цвет, например. серый?
Обратите внимание, что я использую новый NSTableView
на основе представления, начиная с OS X 10.7.
Поскольку вы используете NSTableView на основе представления, вы можете подклассифицировать NSTableRowView, передать его методу делегата таблицы - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row;
, а затем настроить свой выбор в классе представления строк.
Вот пример:
- (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];
}
}
Используйте следующий код в ответ на протокол NSTableViewDelegate
tableViewSelectionDidChange
:
Получите NSTableRowView
для выбранной строки и вызовите метод setEmphasized
на нем.
Если для параметра setEmphasized
установлено значение YES, вы получите синюю подсветку, когда NO вы получите серое выделение.
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSInteger selectedRow = [myTableView selectedRow];
NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setEmphasized:NO];
}
Вот решение Джеймса Чена в Swift 3. Я также добавил метод делегата.
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()
}
Некоторые изменения Жан-Пьера ответ
Используйте следующий код в ответ на протокол NSTableViewDelegate tableViewSelectionDidChange:
Получите NSTableRowView для выбранной строки и вызовите метод setEmphasized на нем. Если для параметра setEmphasized установлено значение YES, вы получите синюю подсветку, когда NO вы получите серое выделение.
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSInteger selectedRow = [myTableView selectedRow];
NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular];
[myRowView setEmphasized:NO];
}
И чтобы избежать танцевального эффекта синего цвета, затем установите серый цвет
[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
При использовании Swift вы можете сделать это в 10.10 для ячеек, основанных на просмотре
Подкласс NSTableCellView
и реализуем это:
//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
}
}
}
Обратите внимание, что стиль выделения NSTableView
должен быть установлен на Regular
, если он находится на SourceList
, это вызовет какое-то странное обрезание.
Это не самое чистое решение, но оно хорошо работает на йосемите
Мне кажется, есть возможность изменить этот документ, так как в документации указано три стиля выбора, а стиль по умолчанию - синий, посмотрите на изображение ниже.. вам нужно отправить ему сообщение, которое я не могу определить так как я никогда не разрабатывал приложения для Mac раньше... надеясь, что это поможет...!
Как уже упоминалось, установите подчеркнутый атрибут на false, но сделайте это в обычном классе NSTableRowView, чтобы избежать побочных эффектов (например, эффект цветовой гаммы):
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
self.emphasized = false
}
Вы должны подклассифицировать NSTableView
и переписать следующие функции, чтобы изменить переменные цвета.
(void) drawRow: (NSInteger) row clipRect: (NSRect) clipRect
(void) drawBackgroundInClipRect: (NSRect) clipRect
** Это изменение основного и альтернативного цвета **
Используйте цикл for и вставьте этот условный (i % 2 == 0)
для обнаружения нечетных и четных строк.
Хорошо, поэтому я знаю, что у него уже есть принятый ответ, но для тех, кто, как я, работающий с NSOutlineView
, и .selectionHighlightStyle = .sourceList
, может использовать этот код, чтобы сделать выделение серым. Этот метод не будет мерцать при изменении выделения и будет оставаться серым, если приложение будет сведено к минимуму.
Делегатор NSTableView/NSOutlineView:
func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView?
{
let row : CustomRowView = CustomRowView.init()
row.identifier = "row"
return row
}
И затем создайте новый CustomRowView.swift
файл с этим:
class CustomRowView : NSTableRowView
{
override var isEmphasized: Bool {
get { return self.isEmphasized }
set(isEmp) { self.isEmphasized = false }
}
}
Это всегда будет сохранять серый цвет.
Я смешал все описанные выше методы и получил код, который точно выполняет то, что я хочу.
Появляются какие-то странные внешние границы и другие остатки.
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: NSTableViewSelectionHighlightStyle {
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()
}
}
Это ответ Жан-Пьера в Swift3:
func tableViewSelectionDidChange(_ notification: Notification)
{
index = tableView.selectedRow
let rowView = tableView.rowView(atRow: index, makeIfNecessary: false)
rowView?.isEmphasized = false
...
У этого есть два ограничения, перечисленные выше - первый щелчок не работает, второй щелчок делает. И есть "танцевальный эффект". Я не против первого и фактически как второго.
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
[tblCategory enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){
CustomMainCell *cellView = [rowView viewAtColumn:0];
if(rowView.selected){
cellView.txtFieldTitle.textColor=[NSColor colorWithCalibratedRed:245.0/255.0 green:110.0/255.0 blue:65.0/255.0 alpha:1.0];
}else{
cellView.txtFieldTitle.textColor=[NSColor whiteColor];
}
}];
}
[tblCategory setSelectionHighlightStyle: NSTableViewSelectionHighlightStyleNone];
Use this Notification for NSTableView:
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
//You Logic stuff
}