gpt4 book ai didi

objective-c - 与所选 NSMenuItem 的背景完全匹配

转载 作者:行者123 更新时间:2023-12-03 16:19:32 24 4
gpt4 key购买 nike

我正在为 NSMenuItem 创建自定义 View 。为了在选择时绘制背景,我改编了 CustomMenus 中的几行样本。 CustomMenus 示例具有:

    [[NSColor alternateSelectedControlColor] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);

..我正在使用 selectedMenuItemColor,因为alternateSelectedControlColor 是纯色,而且看起来不太好:

    [[NSColor selectedMenuItemColor] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);

使用 selectedMenuItemColor 更好,但它仍然与真实选定的 NSMenuItem 不完全相同。

这是一个屏幕截图,显示了“蓝色”外观中左侧真实选定的 NSMenuItem 背景和右侧的 selectedMenuItemColor:

Side-by-side comparison of the real selected menu item background and the selectedMenuItemColor in the "Blue" appearance

您可以看到在实际选定的 NSMenuItem 背景上有一个额外的半透明白色渐变叠加层。

如何复制真实选定的 NSMenuItem 背景?

编辑:这适用于 Mac OS 10.9.5。

编辑2:以下是“ Graphite ”外观的并排比较:

Side-by-side comparison of the real selected menu item background and the selectedMenuItemColor in the "Graphite" appearance

最佳答案

通过反复试验,我想出了以下代码,该代码在“蓝色”和“ Graphite ”外观中绘制的背景几乎与真实选定的 NSMenuItem 背景没有区别:

    [[NSColor selectedMenuItemColor] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);

if (dirtyRect.size.height > 1) {
const NSControlTint currentControlTint = [NSColor currentControlTint];

const CGFloat startingOpacity = (NSBlueControlTint == currentControlTint ? (CGFloat)0.16 : (CGFloat)0.09);
NSGradient *grad = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithWhite:(CGFloat)1.0 alpha:startingOpacity] endingColor:[NSColor colorWithWhite:(CGFloat)1.0 alpha:(CGFloat)0.0]];

const CGFloat heightMinus1 = (CGFloat)(dirtyRect.size.height - 1);
[grad drawFromPoint:NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y + heightMinus1) toPoint:NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y + 1) options:0u];

if (NSBlueControlTint == currentControlTint) {
[[NSColor colorWithWhite:(CGFloat)1.0 alpha:(CGFloat)0.1] set];
NSRectFillUsingOperation(NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y + heightMinus1, dirtyRect.size.width, (CGFloat)1.0), NSCompositeSourceOver);
}
}

以下是并排比较:

"Aqua" appearance comparison

"Graphite" appearance comparison

两个图像的左半部分(80px)显示真实选定的NSMenuItem背景,两个图像的右半部分是代码的结果。

关于objective-c - 与所选 NSMenuItem 的背景完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25964855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com