如何删除 NSTableView 的边框并将单元格选择颜色更改为与 Finder 的相同?

How to remove NSTableView's border and change cell selection color as same as Finder's?

我正在为 Yosemite 制作一个 Cocoa 应用程序。

我在界面生成器中添加了一个基于 NSTableView 的视图,但边框比 Yosemite 的 Finder 的边框宽 2 像素且更厚。 单元格选择颜色为蓝色,而 Yosemite 的 Finder 为灰色。

这就是 Yosemite 的 Finder table 视图的样子。

我检查了 Interface Builder 中的设置。 NSTableView的frame设置的超级滚动视图为(0,0,149,257):

而剪辑视图的框架设置为 (1, 1, 147, 255) 且无法更改。

以及如何制作与 Yosemite 的 Finder 相同的 NSTableView?

非常感谢!

Finder 边栏不是 table 视图,而是 源列表 NSOutlineView:

边框应用在封闭的滚动视图周围:

另请注意,标准 NSOutlineView 允许您从 Interface Buider 中调整突出显示样式:

根据我的经验,即使选择了 "Source List" 突出显示样式,选定的行仍会涂成蓝色。为了避免这种情况,我需要通过子 class 并添加

来防止 table 或大纲视图成为第一响应者
- (BOOL)becomeFirstResponder {
    return NO;
}

编辑: 如果您想支持键盘导航,那么 becomeFirstResponder 实际上很重要。我找到了一个更好的解决方案,它不会覆盖 becomeFirstResponder.

首先,使用(覆盖的)空 setEmphasized: 方法创建自定义 NSTableRowView subclass:

- (void)setEmphasized:(BOOL)emphasized {
    // This avoids a blue background when selected in a source list that has first responder status.
}

然后您可以通过实施

来提供自定义 NSTableRowView class 的实例
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row

在你的 NSTableViewDelegate.

对于想要删除 NSTableView 边框的人...

我的要求是删除 NSTableView 的边框颜色,使其看起来像一个白色框。尝试了所有的属性和论坛,但找不到方法来做到这一点。最后我在故事板中想出了一个可以解决问题的肮脏黑客。如果有人有更好的选择,请告诉我们。

  1. 在 CustomBox 中嵌入 NSTableView。将 Box BorderType 设置为 'None'
  2. 然后将NSTableView 的约束(Left、Top、Right 和Bottom)设置到包含的Box。将值设置为 -2。这样 NSTableView 边框就会在 Box
  3. 之外
  4. 现在在 Storyboard 中,select NSTableView 的 'clipView(NSClipView)'。 clipView 是 NSTableView 的 superView
  5. 转到尺寸检查器并取消选中 "Content Insets"
  6. 的 'Automatically Adjust' 属性
  7. 将值设置为 Left=2Top=2Bottom=-2Right=-2

就是这样。