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

C. *_*ith 5 cocoa core-animation objective-c nsview macos-mojave

使用 macOS 10.14 Mojave 中的暗模式,大多数系统颜色都是半透明的。那就是将控件颜色与窗口背景相匹配,而窗口背景又会稍微着色以匹配桌面图片。

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

自定义滑块控件

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

- (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;
}
Run Code Online (Sandbox Code Playgroud)

当然,我不希望旋钮是透明的,即轨道层不应透光。如何在保留动态色调的同时解决此问题?

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

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

谢谢!

小智 5

NSColorcolorWithAlphaComponent:对你有用吗?

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

IE

self.sliderLayer.backgroundColor = [[NSColor controlColor] colorWithAlphaComponent:1.0f].CGColor;
Run Code Online (Sandbox Code Playgroud)

看起来 darkMode 将控件颜色的 alpha 分量设置为: 0.247059