如何在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
相关产品推荐
相关产品推荐

