How to detect dark mode in Yosemite to change the status bar menu icon

前端 未结 3 1288
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-23 12:27

The status bar app icon has to be changed when dark mode is enabled in Yosemite. How to detect if dark mode has been enabled ? Is there any notification for the same ?

相关标签:
3条回答
  • 2020-12-23 12:38

    The Status bar icon needs to be a template image. Just set the setTemplate:Yes to NSImage. And when switched to dark mode , the vibrancy should apply.

    0 讨论(0)
  • 2020-12-23 12:42

    As noted by bergdesign, you need to observe the system wide notification and read the persistent global domain.

    We made a class to simplify handling changes to the Dark Mode settings: https://github.com/weAreYeah/WAYTheDarkSide

    It becomes as easy as...

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

    and

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

    Hope this helps :)

    0 讨论(0)
  • 2020-12-23 12:47

    You should make use of template images wherever possible because they allow your UI to automatically adapt to changes made by the system (at least when there's not a bug in the system... http://indiestack.com/2014/10/yosemites-dark-mode/). But in the case where you might use a custom view in the status bar and cannot take advantage of a template image, you can manually check for dark mode and adapt your UI accordingly.

    You can check whether or not dark mode is enabled by retrieving a key from the user's global preferences, like this:

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

    At least for the first release of Yosemite, the key is not present when dark mode is disabled, but the key is present and returns the string value @"Dark" when dark mode is enabled. I added the case insensitive compare because I have seen preference keys change their case between system releases, and this adds a little insurance against that.

    To monitor the current state of the setting, you register as an observer of a distributed notification (within an appropriate method), like this:

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

    And you create a method to act as the message selector for the notification, like this:

    -(void)darkModeChanged:(NSNotification *)notif
    {
        NSLog(@"Dark mode changed");
    }
    
    0 讨论(0)
提交回复
热议问题