web-dev-qa-db-ja.com

ビューベースのNSTableViewの選択色を変更する

OS Xアプリケーションの標準の強調色は青です。

それを別の色に変更することは可能ですか?グレー?

OS X 10.7以降で利用可能な新しいビューベースのNSTableViewを使用していることに注意してください。

43
Dev

ビューベースの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];
    }
}
76
James Chen

ここにSwift 3.のJames Chenの解があります。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()
}
20
Felix

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];
}
13
Jean-Pierre

Jean-Pierreの回答に対するいくつかの変更

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];
6
Utkarsha

前に説明したすべてのメソッドを混合して、自分のやりたいことを正確に実行するコードを取得しました。

  • 選択によって内部のテキストフィールドの色が変更されません。
  • 行は1つの選択と色を記憶しています。
  • 奇妙な外枠やその他の残り物が表示されます。

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

すでに述べたように、強調された属性をfalseに設定しますが、副作用(ダンスカラー効果など)を回避するためにカスタムNSTableRowViewクラスで設定します。

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

    }
2
Lubos

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にある場合、奇妙なクリッピングが発生します。

これは最もクリーンなソリューションではありませんが、ヨセミテでうまく機能します

2
arnoapp

このcozを変更するためのオプションがあるようですが、ドキュメントには3つの選択スタイルがあり、通常のデフォルトスタイルは青です。下の画像を見てください。私が理解できないメッセージを送信する必要があります。これまでにMac用のアプリを開発したことはありません。

enter image description here

1

交互の色を変更するには、NSTableViewをサブクラス化し、以下の関数を書き直す必要があります。

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

  • (void) drawBackgroundInClipRect: (NSRect) clipRect **これはメインと代替色を変更するものです**

Forループを使用して、この条件付き(i % 2 == 0)を挿入し、奇数行と偶数行を検出します。

0
Julian

さて、私はそれがすでに受け入れられた答えを持っていることを知っていますが、私のような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 }
    }
}

これにより、選択は常に灰色のままになります。

0
Silicone