更新暗模式:NSColor忽略外观变化?

Unc*_*mon 10 cocoa nscolor macos-mojave

在我的Web视图中,我使用CSS变量在运行时更改各种颜色,具体取决于是否启用了macOS 10.14的暗模式.那很多都很好.棘手的部分是在系统外观变化时更新颜色.

我通过观察effectiveAppearance窗口上的属性来检测更改.该通知按预期发布,但当我更新颜色时,NSColor仍然会给我暗模式颜色(或应用程序启动的任何模式).例如,NSColor.textColor当我响应从暗模式到光线的切换时,仍然是白色而不是黑色.我自己的颜色资产似乎也是如此.

我应该采用不同的方式或时间来获得这些颜色吗?或者这可能是操作系统错误?

编辑:如果Web视图的有效外观名称发生更改, 我还尝试创建子类WebView并更新我的颜色drawRect().第一次,即使应用程序在黑暗模式下启动,我也能获得所有浅色.之后,当我从灯光模式切换到黑暗时,我得到系统颜色的深色版本和资产目录颜色的浅色版本.

在调试器外部,切换到暗模式可以工作,但初始加载总是变为浅色.

Dar*_*ust 13

更改系统外观不会更改当前外观,您可以查询和设置该外观,并且与系统外观无关.但是外观实际上取决于"拥有"视图,因为在同一视图层次结构中,由于活力并且还在appearance视图上手动设置属性,可能会出现几种外观.

可可已经更新当前的外观在少数情况下,如在drawRect:,updateLayer,layoutupdateConstraints.在其他地方,你应该这样做:

NSAppearance * saved = [NSAppearance currentAppearance];
[NSAppearance setCurrentAppearance:someView.effectiveAppearance];

// Do your appearance-dependent work, like querying the CGColor from
// a dynamic NSColor or getting its RGB values.

[NSAppearance setCurrentAppearance:saved];
Run Code Online (Sandbox Code Playgroud)

  • 这适用于系统颜色,但对于我的资产目录中的颜色,它总是返回浅色版本。 (2认同)