3

我试图在我的 Mac 应用程序的标签上获得内部阴影。

我正在尝试匹配我的设计师发送的 Photoshop 设计。我试图匹配的外观是: Photoshop设计

在 Photoshop 中完成此操作的方式是使用以下设置设置内部阴影: Photoshop 设置

我在其他网站上看到了针对此类事情的几种不同解决方案,但没有一个能正常工作。

例如,每个人都说要使用:

[[myNSTextField cell] setBackgroundStyle:NSBackgroundStyleRaised];

我发现了很多关于在 NSBezierPath 或类似但没有标签上做内阴影的东西。

这个问题的答案说使用上面的 setBackgroundStyle 然后说

然后可以通过使用带有 NSGradient 的自定义视图来达到您的渐变背景

但是这种观点去哪里了?答案引用的链接谈到再次在窗口上做内部阴影,而不是文本。

谁能帮我解决这个问题?

谢谢

4

2 回答 2

4

这种效果在 Photoshop 中很容易制作。不幸的是,在 Cocoa 应用程序中它并不是那么简单。我不知道使用标准控件的简单方法,但我会告诉你我将如何处理这个问题。

问题是阴影必须被对象丢弃。换句话说,阴影始终是模态的,不能只绘制没有实际对象的阴影。在核心图形中,阴影是绘图上下文的一个属性。当我们渲染一个对象时,我们可以将阴影效果添加到进程中。

现在,当我们知道真正的问题时,解决方案就是小菜一碟:)

假设这里是从您的文本生成的图像。您可以在 Internet 上找到如何将文本渲染到位图上下文的示例。

在此处输入图像描述

您只需:

反转它。

在此处输入图像描述

将其与阴影一起渲染到图像(位图上下文)。

在此处输入图像描述

通过排除倒置图像来掩盖图像。

在此处输入图像描述

在您拥有的背景纹理上渲染结果图像。

在此处输入图像描述

我会创建一个 NSView 子类并在图层上绘制所有这些东西。您可以找到有关如何创建自己的位图上下文并在其上绘制的示例。以下是如何使用面具https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html

我希望这有帮助。

于 2012-11-08T04:18:11.827 回答
1

我无法想出一种方法来对 NSTextField 的文本进行阴影处理。这可能是可能的,但是对于 NSTextView 来说这很容易,对于一个简单的标签来说应该是一个合理的选择。

这是一个带有清晰背景和白色文本的标签示例,文本上有一个小的黑色阴影。

NSTextView *textView = [[NSTextView alloc] initWithFrame:NSMakeRect(10.0, 10.0f, 200.0f, 20.0f)];
[textView setSelectable:FALSE];
[textView setTextColor:[NSColor whiteColor]];
[textView setBackgroundColor:[NSColor clearColor]];
[textView setFont:[NSFont systemFontOfSize:14.0f]];
[textView setString:@"Boom goes the dynamite!"];

NSShadow *shadow = [[NSShadow alloc] init];
[shadow setShadowColor:[NSColor blackColor]];
[shadow setShadowOffset:NSMakeSize(1.0f, 1.0f)];
[shadow setShadowBlurRadius:1.0];
[textView setShadow:shadow];

[parentView addSubview:textView];

这给出了以下内容:

NSTextView 文本阴影示例

于 2019-02-25T18:56:20.050 回答