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

问题描述 投票:4回答:2

对于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;
}

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

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

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

谢谢!

objective-c cocoa core-animation nsview macos-mojave
2个回答
4
投票

NSColor的colorWithAlphaComponent:能帮到你吗?

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

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

它看起来像黑暗模式将控件颜色的alpha分量设置为:qazxsw poi


4
投票

我尝试的事情:

  • 使用两个图层作为滑块:一个具有窗口背景颜色(为了给它不透明的背景),然后是一个具有相同形状和控件颜色的图层。

请参阅0.247059中的“使用已建立的方法更新自定义视图”以确保颜色动态更新。

© www.soinside.com 2019 - 2024. All rights reserved.