在OSX 10.10 beta 3中,Apple发布了其深色调选项。不幸的是,这也意味着几乎所有状态栏图标(除了我所见过的Apple和Path Finder之外),包括我的,在深色背景上都保持深色。当应用深色调时,如何提供替代图像?

我没有看到NSStatusBarNSStatusItem上的API更改向我显示了更改,我假设这是通知或某种响应,可以随着用户更改色彩轻松进行更改。

当前绘制图像的代码包含在NSView中:

- (void)drawRect:(NSRect)dirtyRect
{
    // set view background color
    if (self.isActive) {
        [[NSColor selectedMenuItemColor] setFill];
    } else {
        [[NSColor clearColor] setFill];
    }

    NSRectFill(dirtyRect);

    // set image
    NSImage *image = (self.isActive ? self.alternateImage : self.image);
    _imageView.image = image;
}

最佳答案

TL; DR:您无需在“黑暗主题”中做任何特别的事情。给NSStatusItem(或NSStatusBarButton)一个模板图像,它将在任何菜单栏上下文中正确设置其样式。

某些应用程序的状态项(例如PathFinder的状态项)已经在Dark Theme中起作用的原因是,它们没有在StatusItem上设置自己的自定义 View ,而是在StatusItem上设置了模板图像。

就像是:

_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[_statusItem setImage:image];

这完全符合您在Mavericks和更早版本以及Yosemite和任何将来发行版中的预期,因为它允许AppKit根据状态项的状态来完成图像的所有样式。

小牛队

在小牛(及更早版本)中,只有2种独特的样式。未按下并按下。这两种样式分别看起来分别是纯黑色和纯白色。 (实际上“纯粹是黑色的”并不完全正确-有一个很小的影响,使它们看上去略微内陷)。

因为只有两种可能的状态,所以状态栏应用程序可以设置其自己的 View ,并根据其突出显示的状态仅绘制黑色或白色即可轻松获得相同的外观。 (但要再次注意,它并非纯粹是黑色的,因此应用程序要么必须在图像中建立效果,要么对难以置信的“不适当的”图标感到满意)。

优胜美地

在优胜美地,至少有32种独特的样式。黑暗主题中的压抑只是其中之一。应用程序没有实用(或不切实际)的方法来执行自己的项目样式,并使其在所有情况下看起来都是正确的。

以下是其中六个可能样式的示例:

现在,不 Activity 的菜单栏上的状态项具有特定的样式,这与过去的简单不透明度更改相反。外观残障是另一种可能的变化。该可能性矩阵还具有其他附加维度。

API

设置为NSStatusItem的view属性的任意 View 无法捕获所有这些变体,因此在10.10中已弃用了它(以及其他相关的API)。

但是,种子3在NSStatusItem上引入了新的API:
@property (readonly, strong) NSStatusBarButton *button NS_AVAILABLE_MAC(10_10);

这段API有几个用途:
  • 现在,应用程序可以在不设置其自定义 View 的情况下获取状态项的屏幕位置(或从中显示 pop 窗口)。
  • 消除了NSStatusItem上对API的需求,例如imagetitlesendActionOn:
  • 提供新API的类:looksDisabled。这样一来,应用程序即可获得标准的禁用/关闭样式(如关闭时为Bluetooth / Time Machine),而无需自定义图片。

  • 如果当前(非自定义 View )API无法完成某些操作,请提出增强请求。 StatusItems应该以在所有状态项中标准化的方式提供行为或外观。

    https://devforums.apple.com/thread/234839上有更多讨论,尽管我在这里总结了大多数内容。

    关于objective-c - NSStatusItem更改图像的深色调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24623559/

    10-09 16:27