【问题标题】:How to detect dark mode in Yosemite to change the status bar menu icon如何在 Yosemite 中检测暗模式以更改状态栏菜单图标
【发布时间】:2014-08-19 09:07:02
【问题描述】:

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

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

【问题讨论】:

    标签: osx-yosemite osx-yosemite-beta


    【解决方案1】:

    您应该尽可能使用模板图像,因为它们允许您的 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");
    }
    

    【讨论】:

    • 这很棒。我用它在NSAppearanceNameVibrantDark(暗模式)和NSAppearanceNameAqua(正常模式)之间切换我的应用程序窗口的外观。
    • 我认为您可以通过将 style && [style isKindOfClass:[NSString class]] 更改为 [style isKindOfClass:[NSString class]] 来简化您的代码。如果sylenil,则发送给它的任何消息(包括-isKindOfClass:)都将返回nil(其值为NO)。
    • 虽然这个解决方案非常适合检测 10.15 及更低版本的暗模式,但 Big Sur (10.16/11.0) 似乎不再支持没有 NSImagesetTemplate:Yes 的系统托盘图标,并且相反,似乎使用墙纸亮度代替。 stackoverflow.com/q/62685948/3196753
    【解决方案2】:

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

    【讨论】:

      【解决方案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];
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 2019-08-08
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多