简而言之:在深色主题下,您不需要进行任何特殊操作。给NSStatusItem(或NSStatusBarButton)一个模板图像,它将在任何菜单栏上下文中正确地应用样式。
一些应用程序(如PathFinder)的状态项目已经在暗色主题下正常工作的原因是它们没有在StatusItem上设置自定义视图,而只是在StatusItem上设置了一个模板图像。
类似这样的东西:
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[_statusItem setImage:image];
在 Mavericks 及之前版本中,以及 Yosemite 和任何未来的版本中,这个功能都能很好地发挥作用,因为它允许 AppKit 根据状态项的状态对图像进行所有的样式设置。
Mavericks
在 Mavericks(和早期版本)中,只有两种独特的状态。未按下和已按下。这两种状态看起来几乎完全是黑色和白色,分别是“纯黑色”并不完全正确 - 还有一种小的效果使它们看起来稍微嵌入。
由于只有两种可能的状态,状态栏应用程序可以设置自己的视图,并通过只绘制黑色或白色来轻松获得相同的外观,具体取决于它们的突出状态。(但请注意,它不是完全黑色,因此应用程序必须在图像中构建效果,或者满足于一个不太显眼的不适当图标)。
Yosemite
在 Yosemite 中,状态项至少有 32 种独特的样式。 在暗主题下未按下仅是其中之一。 应用程序没有实际(或不切实际)的方法来对项目进行自定义样式,并在所有情况下看起来正确。
以下是其中六个可能的样式示例:
![六种可能的状态项样式](https://istack.dev59.com/9igcm.webp)
非活动菜单栏上的状态项现在具有特定的样式,与过去简单的不透明度变化不同。禁用外观是另一种可能的变化; 还有其他附加的 维度 来增加这个样式矩阵。
API
将任意视图设置为 NSStatusItem 的 view
属性无法捕获所有这些变化,因此它(以及其他相关 API)在 10.10 中被弃用。
然而,种子 3 引入了新的 NSStatusItem API:
@property (readonly, strong) NSStatusBarButton *button NS_AVAILABLE_MAC(10_10);
这个API有以下几个作用:
- 应用程序现在可以在不设置自定义视图的情况下获取状态栏项目的屏幕位置(或从中显示弹出窗口)。
- 消除了对于NSStatusItem上
image
、title
、sendActionOn:
等API的需求。
- 提供了一个新API的类:即
looksDisabled
。这使得应用程序可以获得标准的禁用/关闭样式(例如当蓝牙/Time Machine关闭时)而无需使用自定义图像。
如果当前(非自定义视图)API无法实现所需功能,请提出增强请求。StatusItems应该以一种适用于所有状态栏项目的行为或外观方式提供。
更多讨论请参见 https://devforums.apple.com/thread/234839,但是我已经在这里总结了大部分内容。
-drawRect:
方法中手动绘制图像吗?使用NSImageView
子视图会有帮助吗? - Ken Thomases-drawStatusBarBackgroundInRect:withHighlight:
而不是自己选择填充颜色。如果这样做没有帮助,你可以尝试在图像视图上设置背景样式。当然,这就引出了如何选择适当的样式的问题。另外,我会将图像视图的图像设置移动到-viewWillDraw
中。这种事情不应该在-drawRect:
中完成。 - Ken ThomasesNSImageView
很可能能够区分出使用你选择的颜色填充的背景和使用我提到的适当方法绘制的背景之间的差异。它可能会相应地改变其行为。另外,你是否在使用模板图像? - Ken Thomases