【发布时间】: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;
}
}
这是之前暗模式的截图(应该是这样的)
这是用户切换后的灯光模式截图
这是之前lightmode的截图(应该是这样的)
这是用户切换后暗模式的截图
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