【问题标题】:Custom NSView background color not changing when switching in and out of dark mode切换进入和退出暗模式时,自定义 NSView 背景颜色不会改变
【发布时间】:2019-06-10 14:20:53
【问题描述】:

当用户进入和退出黑暗模式时,我不知道如何更新自定义 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;
        }
    }

如果我注释掉对此方法的调用,我会得到预期的行为。

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

【问题讨论】:

  • 请用代码示例解释您实际尝试过的内容。您引用的链接似乎只是解释了如何确定用户是否处于暗模式,而不是如何检测系统何时从/切换到暗模式。
  • 在我的 drawRect 中,我检查 currentAppearance 并调整文本和线条颜色以使用 Aqua 和 DarkAqua 主题。在我的自定义 NSView 中,我使用 viewDidChangeEffectiveAppearance 将视图及其所有子视图的需要显示设置为 YES。这似乎完成了大部分工作,除了自定义视图的背景颜色。
  • @JamesBucanek 请求代码而不是代码描述。 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。
  • 您没有显示背景颜色的实际绘图...始终显示相关的所有内容。并且不要使用 == 来比较字符串。它们可能是相同的指针,但它们可能不是并导致此失败。

标签: objective-c cocoa appearance


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢达伦,是的,确实有效!这是有道理的。最后,通过删除对 colorWithAlphaComponent 的调用,我得到了我想要的结果。不知道为什么我首先要这样做。再次感谢,谜团解开了。
猜你喜欢
  • 2021-10-19
  • 2011-12-14
  • 1970-01-01
  • 2021-04-02
  • 2021-09-18
  • 2020-07-07
  • 2021-12-04
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多