在基于视图的NSTableView上更改选择颜色

Dev*_*Dev 42 cocoa objective-c nstableview osx-lion

OS X应用程序中的标准突出显示颜色为蓝色.

是否可以将其更改为其他颜色,例如灰色?

请注意,我NSTableView从OS X 10.7开始使用新的基于视图的可用.

Jam*_*hen 74

由于您使用的是基于视图的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];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎如果表视图被声明为_source list_` drawSelectionInRect:`在OS X 10.10 Yosemite上根本没有被调用.只有当一个表被声明为_regular_表时,才会在Yosemite上发生这种情况. (8认同)
  • [WWDC 2011 session 120"View Based NSTableView Basic to Advanced"](https://developer.apple.com/videos/wwdc/2011/)给出了一个类似的例子,并且还描述了如何根据表是否实现不同的颜色是第一个响应者/"主动选择"/"强调"与否. (6认同)
  • https://developer.apple.com/library/mac/samplecode/TableViewPlayground/Introduction/Intro.html (2认同)

Fel*_*lix 16

这是James Chen在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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

NSTableViewDelegate:

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    return MyNSTableRowView()
}
Run Code Online (Sandbox Code Playgroud)


小智 12

使用以下代码响应NSTableViewDelegate协议tableViewSelectionDidChange:

获取NSTableRowView所选行并setEmphasized在其上调用方法.当setEmphasized设置为YES时,您将获得蓝色突出显示,否则您将获得灰色突出显示.

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

     NSInteger selectedRow = [myTableView selectedRow];
     NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
     [myRowView setEmphasized:NO];
}
Run Code Online (Sandbox Code Playgroud)


小智 6

Jean-Pierre的一些修改回答

使用以下代码响应NSTableViewDelegate协议tableViewSelectionDidChange:

获取所选行的NSTableRowView并在其上调用setEmphasized方法.当setEmphasized设置为YES时,您将获得蓝色突出显示,而如果没有,则获得灰色突出显示.

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

 NSInteger selectedRow = [myTableView selectedRow];
 NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular];
[myRowView setEmphasized:NO];
}
Run Code Online (Sandbox Code Playgroud)

并避免蓝色然后灰色设置的舞蹈效果

[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
Run Code Online (Sandbox Code Playgroud)