TL;DR:你不必在 Dark Theme 中做任何特别的事情。给 NSStatusItem(或 NSStatusBarButton)一个模板图像,它会在任何菜单栏上下文中正确地设置它的样式。
某些应用程序的状态项(例如 PathFinder 的)已经在 Dark Theme 中工作的原因是因为它们没有在 StatusItem 上设置自己的自定义视图,而只是在 StatusItem 上设置了模板图像。
就像是:
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[_statusItem setImage:image];
这与您在 Mavericks 和更早版本以及 Yosemite 和任何未来版本中所期望的完全一样,因为它允许 AppKit根据状态项状态执行图像的所有样式。
小牛队
在 Mavericks(和更早的版本)中,只有 2 种独特风格的物品。未按和按。这两种风格几乎分别看起来是纯黑色和纯白色。(实际上“纯黑色”并不完全正确——有一个小效果使它们看起来有点内嵌)。
因为只有两种可能的状态,所以状态栏应用程序可以设置自己的视图,并根据其突出显示的状态只需绘制黑色或白色即可轻松获得相同的外观。(但请再次注意,它不是纯黑色,因此应用程序要么必须在图像中构建效果,要么满足于几乎不明显的不合适的图标)。
优胜美地
在优胜美地,至少有 32 种独特的物品样式。Unpressed in Dark Theme 只是其中之一。没有任何实用(或不实用)的方法可以让应用程序自行设置项目样式并使其在所有情况下看起来都正确。
以下是其中六种可能样式的示例:
非活动菜单栏上的状态项现在具有特定的样式,而不是像过去那样简单的不透明度更改。残疾外观是另一种可能的变化;这个可能性矩阵还有其他额外的维度。
API
设置为 NSStatusItemview
属性的任意视图无法捕获所有这些变化,因此它(和其他相关 API)在 10.10 中已弃用。
然而,种子 3 在 NSStatusItem 上引入了新的 API:
@property (readonly, strong) NSStatusBarButton *button NS_AVAILABLE_MAC(10_10);
这段 API 有几个目的:
- 应用程序现在可以在不设置自己的自定义视图的情况下获取状态项的屏幕位置(或显示弹出框)。
- 在 NSStatusItem 上消除对 API 的需要,如
image
, title
, 。sendActionOn:
- 为新 API 提供一个类:即
looksDisabled
. 这允许应用程序获得标准的禁用/关闭样式(如关闭时的蓝牙/Time Machine),而无需自定义图像。
如果当前(非自定义视图)API 无法完成某些操作,请提交增强请求。StatusItems 应该以它在所有状态项中标准化的方式提供行为或外观。
更多讨论请参见 https://devforums.apple.com/thread/234839,尽管我已经在这里总结了大部分内容。