如何在Yosemite中检测暗模式以更改状态栏菜单图标

时间:2014-08-19 09:07:03

标签: osx-yosemite osx-yosemite-beta

在Yosemite中启用暗模式时,必须更改状态栏应用程序图标。 如何检测是否启用了暗模式?是否有相同的通知?

显示另一张图片或更改现有图片的Alpha值会更好吗? 需要输入哪种方式更好?

3 个答案:

答案 0 :(得分:51)

您应该尽可能使用模板图像,因为它们允许您的UI自动适应系统所做的更改(至少当系统中没有错误时...... http://indiestack.com/2014/10/yosemites-dark-mode/) 。但是,如果您可能在状态栏中使用自定义视图而无法利用模板图像,则可以手动检查暗模式并相应地调整UI。

您可以通过从用户的全局首选项中检索密钥来检查是否启用了暗模式,如下所示:

NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
id style = [dict objectForKey:@"AppleInterfaceStyle"];
BOOL darkModeOn = ( style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"] );

至少对于Yosemite的第一个版本,当禁用暗模式时键不存在,但键存在并返回字符串值@" Dark"启用暗模式时。我添加了不区分大小写的比较,因为我看到偏好键在系统版本之间改变了它们的情况,这增加了一点保险。

要监控设置的当前状态,请注册为分布式通知的观察者(在适当的方法中),如下所示:

[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(darkModeChanged:) name:@"AppleInterfaceThemeChangedNotification" object:nil];

您创建了一个方法来充当通知的消息选择器,如下所示:

-(void)darkModeChanged:(NSNotification *)notif
{
    NSLog(@"Dark mode changed");
}

答案 1 :(得分:15)

状态栏图标需要是模板图像。 只需将setTemplate:Yes设置为NSImage即可。 当切换到黑暗模式时,应该适用活力。

答案 2 :(得分:3)

正如 bergdesign 所述,您需要观察系统范围的通知并阅读持久的全局域。

我们制作了一个类来简化对暗模式设置的处理更改: https://github.com/weAreYeah/WAYTheDarkSide

变得像......一样简单。

[WAYTheDarkSide welcomeApplicationWithBlock:^{
    // Enabling Dark Mode
    [someWindow setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameVibrantDark]];
    [someVisualEffectView setMaterial:NSVisualEffectMaterialDark];

} immediately:YES];

[WAYTheDarkSide outcastApplicationWithBlock:^{
    // Disabling Dark Mode
    [someWindow setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameVibrantLight]];
    [someVisualEffectView setMaterial:NSVisualEffectMaterialLight];

} immediately:YES];

希望这会有所帮助:)