在Mojave上使用Core Animation图层进行绘制时,如何解决透明系统的颜色?

时间:2019-03-17 10:35:18

标签: objective-c cocoa core-animation nsview macos-mojave

在macOS 10.14 Mojave中使用暗模式时,大多数系统颜色是半透明的。这是为了使控件颜色与窗口背景匹配,而窗口背景又略微着色以与桌面图片匹配。

现在,当使用重叠的CoreAnimation图层构建视图时,事情变得一团糟。示例:

custom slider control

这是使用CALayers构建的自定义滑块。垂直轨道是旋钮层下面的一层。这是我设置颜色的方法:

- (void)updateColors // Called from updateLayer()
{
    self.tickmarkLayer.strokeColor = [NSColor tertiaryLabelColor].CGColor;
    self.tickmarkLayer.lineWidth = 1.0;

    self.trackLayer.backgroundColor = [NSColor controlBackgroundColor].CGColor;
    self.trackLayer.borderColor = [NSColor tertiaryLabelColor].CGColor;
    self.trackLayer.borderWidth = 1.0;

    self.sliderLayer.backgroundColor = [NSColor controlColor].CGColor;
}

当然,我不希望旋钮透明。 e。跟踪层不应发光。在保留动态色彩的同时如何解决此问题?

理想情况下,可以使用当前的色度且没有透明度来访问“有效”系统的颜色。但是我没有找到这样做的API。

将阴影应用于具有透明(系统)颜色的图层时,也会发生类似的问题。

谢谢!

2 个答案:

答案 0 :(得分:4)

NSColor的colorWithAlphaComponent:为您解决问题吗?

https://developer.apple.com/documentation/appkit/nscolor/1526906-colorwithalphacomponent?language=objc

self.sliderLayer.backgroundColor = [[NSColor controlColor] colorWithAlphaComponent:1.0f].CGColor;

darkMode似乎将控件颜色的alpha分量设置为:0.247059

答案 1 :(得分:4)

我会尝试的事情:

  • 使用两层滑块:一层具有窗口背景色(使其具有不透明的背景),然后一层具有相同形状和顶部的controlColor。

请参阅Supporting Dark Mode in Your Interface中的“使用既定方法更新自定义视图”以确保颜色是动态更新的。

  • 使用NSBox而不是图层来绘制滑块。同样,您可能需要其中两个。但是NSBox可以自动处理动态UI颜色和着色。参见windowBackgroundColor