NSColor系统切换暗/亮模式时颜色不改变

时间:2019-07-10 10:17:20

标签: macos nscolor macos-darkmode

我正在尝试通过在select * from emp where name like ('%I%'); 中切换暗/亮模式来更改图像的颜色。 我正在使用以下代码来更改图像的颜色:

NSViewController

我尝试从- (NSImage *)image:(NSImage *)image withColour:(NSColor *)colour { NSImage *img = image.copy; [img lockFocus]; [colour set]; NSRect imageRect = NSMakeRect(0, 0, img.size.width, img.size.height); NSRectFillUsingOperation(imageRect, NSCompositingOperationSourceAtop); [img unlockFocus]; return img; } 调用此方法

viewWillLayout

但是似乎系统颜色总是返回相同的RGB值。

我也尝试过监听通知self.help1Image.image = [self image:self.help1Image.image withColour:[NSColor systemRedColor]]; ,但是即使在这里,似乎RGB值仍保持不变AppleInterfaceThemeChangedNotification

1.000000 0.231373 0.188235

我在[[NSDistributedNotificationCenter defaultCenter] addObserverForName:@"AppleInterfaceThemeChangedNotification" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { NSLog(@"AppleInterfaceThemeChangedNotification"); self.help1Image.image = [self image:self.help1Image.image withColour:[NSColor systemRedColor]]; NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace]; NSColor *testColor = [[NSColor systemBlueColor] colorUsingColorSpace:colorSpace]; CGFloat red = [testColor redComponent]; CGFloat green = [testColor greenComponent]; CGFloat blue = [testColor blueComponent]; NSLog(@"%f %f %f", red, green, blue); }]; 微调和覆盖NSButtonCell中可以正常工作,但是在layout中无法正常工作

1 个答案:

答案 0 :(得分:3)

首先,查看文档部分“使用特定方法更新自定义视图” here。它说:

  

当用户更改系统外观时,系统会自动要求每个窗口和视图重绘自身。在此过程中,系统将为macOS和iOS调用下表中列出的几种众所周知的方法来更新您的内容。系统会在调用这些方法之前更新特征环境,因此,如果您对它们进行了所有与外观有关的更改,则应用程序会正确更新自己。

但是,该表中没有列出NSViewController个方法。

由于视图的外观可以独立于当前或“系统”外观,因此,对视图控制器中的外观变化做出反应的最佳方法是对视图的effectiveAppearance属性进行KVO或在{ {1}}。

[NSView viewDidChangeEffectiveAppearance]

- (void)viewDidLoad { [self addObserver:self forKeyPath:@"view.effectiveAppearance" options:0 context:nil]; } // ... - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { if ([keyPath isEqualToString:@"view.effectiveAppearance"]) { // ... 具有NSAppearance属性,该属性与系统外观无关,并且由Cocoa按照上面列出的方法进行更新。在其他任何地方,您都需要检查自己是否正确。惯用的方法还是通过视图的currentAppearance

effectiveAppearance

因此,在您的情况下,以下对我来说很有效:

[NSAppearance setCurrentAppearance:someView.effectiveAppearance];