当用户切换为暗模式时,我无法弄清楚如何更新自定义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;
}
}
如果我取消对此方法的调用,我会得到预期的行为。
当用户在明暗模式之间切换时,为什么这会导致我失去背景颜色更改的自动行为?
答案 0 :(得分:1)
我的猜测是您实际上并没有使用标准颜色作为背景色。
您正在使用[NSColor windowBackgroundColor],但是随后使用不同的alpha分量(通过colorWithAlphaComponent)制作了副本,使其不再是标准颜色。
我的猜测是,当您使用标准颜色定义时,会发生许多自动的“正常工作”行为。作为测试,您是否可以尝试从settransparent方法中删除colorWithAlphaComponent调用(在其中添加透明度),然后查看它是否有效?如果需要的话,如果您想要自动行为,则可能需要寻找另一种方法来增加视图的透明度。