Подтвердить что ты не робот

Изменение цвета выбора на основе NSTableView

Стандартный цвет подсветки в приложениях OS X - синий.

Можно ли изменить его на другой цвет, например. серый?

Обратите внимание, что я использую новый NSTableView на основе представления, начиная с OS X 10.7.

4b9b3361

Ответ 1

Поскольку вы используете 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];
    }
}

Ответ 2

Используйте следующий код в ответ на протокол 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];
}

Ответ 3

Вот решение Джеймса Чена в 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()
}

Ответ 4

Некоторые изменения Жан-Пьера ответ

Используйте следующий код в ответ на протокол 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];

Ответ 5

При использовании 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, это вызовет какое-то странное обрезание.

Это не самое чистое решение, но оно хорошо работает на йосемите

Ответ 6

Мне кажется, есть возможность изменить этот документ, так как в документации указано три стиля выбора, а стиль по умолчанию - синий, посмотрите на изображение ниже.. вам нужно отправить ему сообщение, которое я не могу определить так как я никогда не разрабатывал приложения для Mac раньше... надеясь, что это поможет...!

enter image description here

Ответ 7

Как уже упоминалось, установите подчеркнутый атрибут на false, но сделайте это в обычном классе NSTableRowView, чтобы избежать побочных эффектов (например, эффект цветовой гаммы):

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

    }

Ответ 8

Вы должны подклассифицировать NSTableView и переписать следующие функции, чтобы изменить переменные цвета.

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

  • (void) drawBackgroundInClipRect: (NSRect) clipRect ** Это изменение основного и альтернативного цвета **

Используйте цикл for и вставьте этот условный (i % 2 == 0) для обнаружения нечетных и четных строк.

Ответ 9

Хорошо, поэтому я знаю, что у него уже есть принятый ответ, но для тех, кто, как я, работающий с 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 }
    }
}

Это всегда будет сохранять серый цвет.

Ответ 10

Я смешал все описанные выше методы и получил код, который точно выполняет то, что я хочу.

  • Выбор не меняет цвет текстовых полей внутри;
  • Строки запоминают выбор и цвет одного;
  • Появляются какие-то странные внешние границы и другие остатки.

    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()
        }
    }
    

Ответ 11

Это ответ Жан-Пьера в Swift3:

func tableViewSelectionDidChange(_ notification: Notification)
    { 
        index = tableView.selectedRow
        let rowView = tableView.rowView(atRow: index, makeIfNecessary: false)
        rowView?.isEmphasized = false
...

У этого есть два ограничения, перечисленные выше - первый щелчок не работает, второй щелчок делает. И есть "танцевальный эффект". Я не против первого и фактически как второго.

Ответ 12

- (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];

Ответ 13

  Use this Notification for NSTableView:

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

                 //You Logic stuff
             }