macos - NSTableView 带有 +/- 按钮,就像在系统偏好设置中仅使用 Interface Builder

标签 macos cocoa interface-builder

Apple 通常将 +/- 按钮放置在表格 (NSTableView) 下方,例如在网络或用户和组的系统偏好设置中。见下图:

Table Bottom - User & Groups System Prefs

如何在 Interface Builder 中直接将相同的按钮放置在表格下方,而无需操作代码中的任何界面元素或对任何元素类进行子类化?

最佳答案

如果表格具有固定宽度,最简单的方法是使用分段控件NSSegmentedControl。首先将其添加到您的 View 或窗口中:

Segmented Control

将其样式更改为小方 block ,将模式更改为无选择并将段数增加到4(或保持在3 如果您只需要 +-):

Segmented Control Setup

+、- 和其他按钮是 AppKit 框架的预定义图像(NSAddTemplateNSRemoveTemplate),可直接在 Interface Builder 中使用。例如。您可以按如下方式设置前三个部分:

Segment 0 Setup Segment 1 Setup Segment 2 Setup

出于演示目的,我禁用了 - 段。与大多数其他按钮不同,禁用分段控件的一部分只会使图像/文本变暗,而不会更改按钮背景。仅禁用整个分段控件会更改背景(当然也会禁用所有分段)。

当然,最后一段应该始终被禁用,否则它将是可点击的,并且在点击时会改变其背景。由于它不包含图像或文本,因此禁用后它看起来仍然相同。

切换到尺寸设置并取消选中除最后一个片段之外的所有片段的Fixed复选框,确保选中最后一个片段:

Segment 0 Size Setup Segment 1 Size Setup Segment 2 Size Setup Segment 3 Size Setup

取消选中固定会使段宽度动态化,这意味着它将始终匹配内容所需的最小宽度。

最后将控件直接放置在表格下方并调整其大小以匹配表格宽度。结果如下:

The Result

几乎完美,你不觉得吗?

如果表格宽度是动态的(例如表格大小与窗口大小一起调整),事情会变得更加困难。分段控件不支持自动调整大小,这意味着每次调整表大小时,您都必须以编程方式更改其最后一段的宽度。当然,这并不难做到,并且只需要很少的代码,但有一种替代解决方案不需要任何一行代码。

将段数减少 1,并用不带标题的渐变按钮(NSButton)替换最后一段:

Gradient Button

它的背景看起来与分段控件完全相同,但它确实支持自动调整大小以始终匹配表格的大小。只有一个问题:它是可点击的,但这次禁用它不起作用,因为这会改变背景。相反,只需将其类型更改为Momentary Change(这意味着应用程序希望在单击按钮时控制 UI 更改本身):

Gradient Button Setup

正确放置按钮并调整大小后,结果看起来和以前一样好,但这次表格可以调整大小,底部的按钮将始终完美适合。

Sample Window Small Sample Window Bigger

关于macos - NSTableView 带有 +/- 按钮,就像在系统偏好设置中仅使用 Interface Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586313/

相关文章:

ios - SceneKit Rigged 角色动画提高性能

java - 无法在 OSX 上启动 Eclipse(版本不适合)

objective-c - 在 OS X 应用程序中绘制四边形曲线

ios - 使对象居中,使垂直约束始终均匀

macos - 在 Mac OSX Sierra 上重新打开相机并显示时 OpenCV 崩溃

macos - Mac OS X 上的命令行 IntelliJ

ios - 如何在 Interface Builder 中取消 Hook ?

iphone - 如何使用 Objective C 匹配两个随机数,然后在 xcode 界面生成器中打印匹配

cocoa - NSWindows 的编程等效项为 "Visible at Launch"

objective-c - 为什么 NSRect 和 CGRect 是不兼容的类型?