进入和退出暗模式时,自定义NSView背景颜色不会更改

时间:2019-06-10 14:20:53

标签: objective-c cocoa appearance

当用户切换为暗模式时,我无法弄清楚如何更新自定义NSView的背景色。

我已阅读文档并按照此处的说明进行操作:detecting darkmode

奇怪的是,我可以使所有子视图正常运行,但是由于某些奇怪的原因,我无法更改主视图的背景色。当我在任何一种模式下启动应用程序时,视图的背景色看起来都是正确的,但是当我在应用程序运行时在两种模式之间切换时,背景色不会更新为新主题。

对于任何建议将不胜感激。

在自定义NSView中,我有方法

- (void) viewDidChangeEffectiveAppearance
{
    self.needsDisplay = YES;
}

在drawRect内,在继续在视图中进行绘制之前,我需要进行简单的颜色更改

NSAppearance *currentAppearance = [NSAppearance  currentAppearance];
if (@available(*, macOS 10.14)) {
    if(currentAppearance.name == NSAppearanceNameDarkAqua) {
        red  = 0.5*red+0.5;
        green = 0.5*green+0.5;
        blue  = 0.5*blue+0.5;
    }
}

这是以前的暗模式(它的外观)的屏幕截图

Dark Mode Before

这是用户切换后灯光模式的屏幕截图

Light Mode After

这是以前的lightmode的屏幕截图(外观)

Light Mode Before

这是用户切换后的暗模式屏幕截图

Dark Mode After

ps我很困惑,几乎没有代码要发布的原因是,正确的行为应该毫不费力地自动发生。我什至从笔尖删除了视图,然后重新构建它,以为可能某些设置已损坏,但这并不能解决问题。

更新:我找到了问题的根源。在windowDidLoad

中调用此方法
- (void) setTransparent:(BOOL)transparent
    {
        if(transparent) {
            [self.window setOpaque:NO];
            NSColor *backgroundColor = [NSColor windowBackgroundColor];
            backgroundColor = [backgroundColor colorWithAlphaComponent: .75];
            [self.window setBackgroundColor:backgroundColor];
            self.window.alphaValue = 0.75;
    }
    else {
            [self.window setOpaque:YES];
            NSColor *backgroundColor = [NSColor windowBackgroundColor];
            backgroundColor = [backgroundColor colorWithAlphaComponent: 1];
            [self.window setBackgroundColor:backgroundColor];
            self.window.alphaValue = 1;
        }
    }

如果我取消对此方法的调用,我会得到预期的行为。

当用户在明暗模式之间切换时,为什么这会导致我失去背景颜色更改的自动行为?

1 个答案:

答案 0 :(得分:1)

我的猜测是您实际上并没有使用标准颜色作为背景色。

您正在使用[NSColor windowBackgroundColor],但是随后使用不同的alpha分量(通过colorWithAlphaComponent)制作了副本,使其不再是标准颜色。

我的猜测是,当您使用标准颜色定义时,会发生许多自动的“正常工作”行为。作为测试,您是否可以尝试从settransparent方法中删除colorWithAlphaComponent调用(在其中添加透明度),然后查看它是否有效?如果需要的话,如果您想要自动行为,则可能需要寻找另一种方法来增加视图的透明度。