OS Xアプリケーションの標準の強調色は青です。
それを別の色に変更することは可能ですか?グレー?
OS X 10.7以降で利用可能な新しいビューベースのNSTableView
を使用していることに注意してください。
ビューベースの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];
}
}
ここに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()
}
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];
}
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];
前に説明したすべてのメソッドを混合して、自分のやりたいことを正確に実行するコードを取得しました。
奇妙な外枠やその他の残り物が表示されます。
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()
}
}
}
すでに述べたように、強調された属性をfalseに設定しますが、副作用(ダンスカラー効果など)を回避するためにカスタムNSTableRowViewクラスで設定します。
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
self.emphasized = false
}
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
にある場合、奇妙なクリッピングが発生します。
これは最もクリーンなソリューションではありませんが、ヨセミテでうまく機能します
このcozを変更するためのオプションがあるようですが、ドキュメントには3つの選択スタイルがあり、通常のデフォルトスタイルは青です。下の画像を見てください。私が理解できないメッセージを送信する必要があります。これまでにMac用のアプリを開発したことはありません。
交互の色を変更するには、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 }
}
}
これにより、選択は常に灰色のままになります。