24

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

显示另一个图像或更改现有图像的 alpha 值会更好吗?需要输入哪个是更好的方法?

4

3 回答 3

54

您应该尽可能使用模板图像,因为它们允许您的 UI 自动适应系统所做的更改(至少当系统中没有错误时...... http://indiestack.com/2014/10/yosemites -暗模式/)。但是在您可能在状态栏中使用自定义视图并且无法利用模板图像的情况下,您可以手动检查暗模式并相应地调整您的 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");
}
于 2014-10-20T18:39:16.520 回答
16

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

于 2014-08-26T04:25:30.563 回答
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];

希望这可以帮助 :)

于 2014-11-19T08:57:05.523 回答