【问题标题】:Setting the background of NSBox to a gradient programmatically without subclassing以编程方式将 NSBox 的背景设置为渐变而不进行子类化
【发布时间】:2008-11-11 18:40:16
【问题描述】:
我想将NSBox 的背景设置为渐变。在 Interface Builder 中,可以将 NSBox 的背景颜色设置为 selectedMenuColor,这是一个渐变。
NSBox 只有一个setFillColor 方法,那么Interface Builder 是如何用渐变填充它的呢?
如何以编程方式填充NSBox 而不对其进行子类化?继承 NSBox 是微不足道的,但 Interface Builder 的工作原理表明可能会有更好的解决方案。
【问题讨论】:
标签:
objective-c
cocoa
interface-builder
【解决方案1】:
selectedMenuColor 是一种“神奇”颜色,不显示为纯色。系统中存在许多这些“神奇”颜色。
我以前用过colorWithPatternImage:。但请注意,您用作图案的图像会被平铺,因此您可能需要将图像的大小调整为框的大小。
【解决方案2】:
可能最接近您的方法是使用使用colorWithPatternImage: 创建的 NSColor,然后创建您想要的渐变作为图像并将其加载。丑陋,但应该可以工作。我认为子类化是你最好的选择。
【解决方案3】:
selectedMenuColor 颜色实际上是渐变的预渲染图像,而不是动态绘制的渐变,因此无法指定任意渐变作为背景颜色。正如 Ben 所说,子类化可能是要走的路。
【解决方案4】:
在xib 中,选择NSBox,然后转到效果检查器,检查NSBox 的核心动画层。
现在
IBOutlet NSBox *box;
[box.setWantsLayer:YES];
[box.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];
或
[box.setWantsLayer:YES];
[box.layer setBackgroundColor:[[NSColor colorWithPatternImage:[NSImage imageNamed:@"white.gif"]] CGColor]];