根据 NSAppearance 绘制正确的 CALayer 颜色

Drawing correct CALayer colors honoring NSAppearance

我正在研究通过设置 window.appearance 来为我的应用设置主题。 在我的应用程序中,我在图层内绘制了一些东西。我还使用 Core Plot,它会分层呈现图表。

对于默认的浅绿色外观,我只使用系统颜色(例如 NSColor.textColorNSColor.gridColor),它们在 CALayer 中以正确的颜色绘制。但是将 window 的外观更改为鲜艳的深色会导致颜色绘制不正确。 Is there any way to obtain the correct color for a givenNS外观?私人 API 也可以接受。


如果问题不清楚,这里有一个非常简单的例子来说明问题。

我设置了一个作为主视图子层的子层添加的 CATextLayer 和一个作为子视图添加的 NSTextFied

CATextLayer* textLayer = [CATextLayer new];
textLayer.string = @"Is this colored correctly? (Layer)";
textLayer.foregroundColor = NSColor.textColor.CGColor;
textLayer.contentsScale = 2.0;
textLayer.frame = (CGRect){0,0, [textLayer preferredFrameSize]};

NSTextField* textField = [NSTextField new];
textField.stringValue = @"Is this colored correctly? (View)";
textField.textColor = NSColor.textColor;
textField.font = (__bridge id)textLayer.font;
textField.editable = NO;
textField.selectable = NO;
textField.bezeled = NO;
textField.backgroundColor = nil;
[textField sizeToFit];
textField.frame = (CGRect){0, 60, textField.bounds.size};

[self.view.layer addSublayer:textLayer];
[self.view addSubview:textField];

在 Aqua window 上,两者都正确显示:

但是,在充满活力的黑暗 window 上,图层不会,而文本字段会:

我想知道如何获得给定 NSAppearance 的正确颜色。

所以我的方法不对。

正确的方法是在视图中实现 -updateLayer 并在那里获取颜色的 CGColor 快照。 -updateLayer 在外观发生变化时调用,因此视图可以使用正确的颜色值更新它。