You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MacOS Monterey中获取菜单栏文本颜色?原方法已失效

macOS 12.6(Monterey)菜单栏图标明暗适配问题

我正在开发一款带菜单栏图标的应用,在旧版macOS系统中,我用以下代码判断深色模式状态,以此决定绘制黑色还是白色图标:

- (BOOL )amiindarkmode   {
    
  if (  [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"] != nil ) 
  return YES ;
   
     return NO ;
     
}

但在macOS 12.6中,菜单栏颜色似乎独立于全局深色模式,仅随昼夜时间自动切换。请问在该系统版本中是否有新的变量需要监听?


在macOS 12.6及后续版本中,直接读取AppleInterfaceStyle已经无法准确匹配菜单栏的外观状态——因为系统新增了**“自动切换菜单栏和Dock”**的独立设置(可在「系统设置>桌面与程序坞」中开启),此时菜单栏的明暗会根据昼夜时间自动切换,和全局深色模式状态分离。

你可以通过以下方式调整适配逻辑:

  • 监听菜单栏实际外观,而非全局设置
    不要直接读取用户默认值,而是通过NSStatusItem的effectiveAppearance判断当前菜单栏的实时外观风格,这是最准确的方式:

    - (BOOL)isMenuBarInDarkMode {
        NSStatusItem *statusItem = /* 你的状态栏项目实例 */;
        NSAppearance *appearance = statusItem.effectiveAppearance;
        return [appearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameDarkAqua, NSAppearanceNameAqua]] == NSAppearanceNameDarkAqua;
    }
    
  • 监听外观变化通知,自动更新图标
    注册NSApplicationAppearanceDidChangeNotification通知,当系统外观(包括菜单栏)变化时,自动触发图标重绘:

    // 在初始化代码中注册通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(updateMenuBarIcon)
                                                 name:NSApplicationAppearanceDidChangeNotification
                                               object:nil];
    
    // 图标更新方法
    - (void)updateMenuBarIcon {
        BOOL isDark = [self isMenuBarInDarkMode];
        // 根据明暗状态切换图标
        self.statusItem.button.image = isDark ? [NSImage imageNamed:@"WhiteIcon"] : [NSImage imageNamed:@"BlackIcon"];
    }
    
  • 可选:判断自动切换功能是否开启
    如果你需要知道系统是否开启了菜单栏自动切换功能,可以读取这个用户默认值:

    BOOL autoSwitchEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleInterfaceStyleSwitchesAutomatically"];
    

这种方式比直接读取AppleInterfaceStyle更可靠,能适配全局深色模式、菜单栏自动切换等多种场景。


内容的提问来源于stack exchange,提问作者kob2040

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:30:46