绘制正确的CALayer颜色,以纪念NSAppearance

时间:2018-04-14 00:51:11

标签: macos calayer nswindow theming

我正在通过设置window.appearance来查看我的应用。 在我的应用程序中,我在图层中绘制了一些内容。我还使用Core Plot,它将图表呈现在图层中。

对于默认的浅绿色外观,我只使用系统颜色(例如NSColor.textColorNSColor.gridColor),并在CALayer中以正确的颜色绘制。但是将窗口外观更改为鲜艳的黑暗会导致颜色绘制不正确。 Is there any way to obtain the correct color for a given NSAppearance?私有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窗口中,两者都显示正确:

enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

所以我的方法不正确。

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