objective-c - 切换暗模式时自定义 NSView 背景颜色不会改变

标签 objective-c cocoa appearance

当用户切换到或退出深色模式时,我无法弄清楚如何更新自定义 NSView 的背景颜色。

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

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

如有任何建议,我们将不胜感激。

在自定义 NSView 中我有方法

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

在drawRect内部,我在继续在 View 中绘图之前做了一个简单的颜色更改

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

这是之前灯光模式的屏幕截图(它应该看起来的样子)

Light Mode Before

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

Dark Mode After

ps 我感到困惑并且几乎没有代码可发布的原因是正确的行为应该毫不费力地自动发生。我什至从 Nib 删除了 View 并重建它,认为可能某些设置已损坏,但这并没有解决问题。

更新:我找到了问题的根源。该方法在 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;
        }
    }

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

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

最佳答案

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

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

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

关于objective-c - 切换暗模式时自定义 NSView 背景颜色不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56528256/

相关文章:

ios - 在 PayPal 中启用信用卡付款会导致模拟器和物理设备崩溃

iphone - 外观代理重载 View

objective-c - 如何在 macOS 10.14 上检测到暗模式?

objective-c - 通过 NSPersistentStore 类方法获取存储元数据时出错

ios - ios 9 未注册设备 token

ios - 获取表情符号键盘IOS 8的高度

uitabbar - 更改 tvOS 标签栏焦点颜色

objective-c - 使用 [NSString stringWithString : @"some string"] versus @"some string" 的优缺点

objective-c - 使用来自异步 NSURLConnection 的数据填充 NSImage

iphone - 将对象从一个 NSDictionary 复制到另一个 NSDictionary