How to get the source lists selection highlight to

2020-02-22 10:17发布

问题:

In OS X 10.10 source lists seem to use the light vibrancy appearance. In the Finder (and in some other third party applications, Things.app for example) the selected item in the source list is indicated by a dark vibrancy appearance. For example, see the Desktop row in the image below.

How can I replicate this behaviour? Do I need to use the delegate methods to specify the table row view,

-outlineView:rowViewForItem:

and attempt custom drawing myself or is there a more straight forward approach? If you make a standard source list UI in Xcode the default highlighting is remain the standard blue rectangle that we have seen in previous version of OS X.

回答1:

After playing around for a while I found a way to accomplish this. It turned out that I would get the "Finder highlight" style when using NSTableViewSelectionHighlightStyleSourceList and clicking outside my NSOutlineView. So I figured it would stay that way if you refuse making it first responder.

Simply make your NSOutlineView a subclass and override this method:

-(BOOL)acceptsFirstResponder{
    return NO;
}

It works, but with some downsides. For example, using arrow keys in the NSOutlineView will no longer work. I downloaded the Things app, and it does not allow use of arrow keys either, so it's very likely that this is how they are doing it. If anyone finds a better way, please post it.



回答2:

Here is the Swift equivalent :

func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? {
    return CustomTableRowView(frame: NSZeroRect);
}

And the subclass of NSTableRowView

import Cocoa

class CustomTableRowView: NSTableRowView {

    override var isEmphasized: Bool {
        set {}
        get {
            return false;
        }
    }

}


回答3:

If you would like to keep arrow keys working, you can subclass NSTableRowView and override the following method:

- (BOOL)isEmphasized
{
    return NO;
}


回答4:

I am not sure, this is "Dark Vibrancy".

I would rather try setting the background color to something like "Alternate Selected Control Text Color"

Have a look at an NSTextField in InterfaceBuilder. there are many "Control Text" colors, which have a special appearance on visual effect views.

and for setting the selection color see this answer (untested): NSTableview Change the highlight colour