更改 NSView 背景颜色的最佳方法

我正在寻找改变 NSViewbackgroundColor的最佳方法。我还希望能够设置适当的 alpha掩码的 NSView。比如:

myView.backgroundColor = [NSColor colorWithCalibratedRed:0.227f
green:0.251f
blue:0.337
alpha:0.8];

我注意到,NSWindow有这种方法,我不是一个大风扇的 NSColorWheel,或 NSImage背景选项,但如果他们是最好的,愿意使用。

124553 次浏览

我想我知道该怎么做了:

- (void)drawRect:(NSRect)dirtyRect {
// Fill in background Color
CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
CGContextSetRGBFillColor(context, 0.227,0.251,0.337,0.8);
CGContextFillRect(context, NSRectToCGRect(dirtyRect));
}

是的,你自己的回答是正确的。你也可以使用 Cocoa 方法:

- (void)drawRect:(NSRect)dirtyRect {
// set any NSColor for filling, say white:
[[NSColor whiteColor] setFill];
NSRectFill(dirtyRect);
[super drawRect:dirtyRect];
}

斯威夫特:

class MyView: NSView {


override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)


// #1d161d
NSColor(red: 0x1d/255, green: 0x16/255, blue: 0x1d/255, alpha: 1).setFill()
dirtyRect.fill()
}


}

一个简单有效的解决方案是将视图配置为使用核心动画层作为其后台存储。然后可以使用 -[CALayer setBackgroundColor:]设置图层的背景颜色。

- (void)awakeFromNib {
self.wantsLayer = YES;  // NSView will create a CALayer automatically
}


- (BOOL)wantsUpdateLayer {
return YES;  // Tells NSView to call `updateLayer` instead of `drawRect:`
}


- (void)updateLayer {
self.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.227f
green:0.251f
blue:0.337
alpha:0.8].CGColor;
}

就是这样!

我看了所有这些答案,不幸的是,没有一个对我有用。然而,经过大约一个小时的搜索,我发现了这个极其简单的方法:)

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);

看看 RMSkinnedView,你可以在 Interface Builder 内设置 NSView 的背景颜色。

最佳解决方案:

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.wantsLayer = YES;
}
return self;
}


- (void)awakeFromNib
{
float r = (rand() % 255) / 255.0f;
float g = (rand() % 255) / 255.0f;
float b = (rand() % 255) / 255.0f;


if(self.layer)
{
CGColorRef color = CGColorCreateGenericRGB(r, g, b, 1.0f);
self.layer.backgroundColor = color;
CGColorRelease(color);
}
}

如果首先将 WantsLayer 设置为 YES,则可以直接操作图层背景。

[self.view setWantsLayer:YES];
[self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];

斯威夫特:

override func drawRect(dirtyRect: NSRect) {


NSColor.greenColor().setFill()
NSRectFill(dirtyRect)


super.drawRect(dirtyRect)
}

我测试了以下内容,它对我很有效(在 Swift 中) :

view.wantsLayer = true
view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor

编辑/更新: Xcode 8.3.1• Swift 3.1

extension NSView {
var backgroundColor: NSColor? {
get {
guard let color = layer?.backgroundColor else { return nil }
return NSColor(cgColor: color)
}
set {
wantsLayer = true
layer?.backgroundColor = newValue?.cgColor
}
}
}

用途:

let myView = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
print(myView.backgroundColor ?? "none")     //  NSView's background hasn't been set yet = nil
myView.backgroundColor = .red               // set NSView's background color to red color
print(myView.backgroundColor ?? "none")
view.addSubview(myView)

在雨燕你可以子类 NSView 和这样做

class MyView:NSView {
required init?(coder: NSCoder) {
super.init(coder: coder);


self.wantsLayer = true;
self.layer?.backgroundColor = NSColor.redColor().CGColor;
}
}

如果你是一个故事板爱好者,这里有一个方法,你 不需要任何代码行

NSBox作为子视图添加到 NSView,并将 NSBox 的帧调整为与 NSView 相同。

在故事板或 XIB 改变标题位置为无,框类型为 习俗,边框类型为“无”,边框颜色为任何你喜欢的。

下面是一个截图:

enter image description here

这就是结果:

enter image description here

在 Swift 3中,你可以创建一个扩展:

extension NSView {
func setBackgroundColor(_ color: NSColor) {
wantsLayer = true
layer?.backgroundColor = color.cgColor
}
}


// how to use
btn.setBackgroundColor(NSColor.gray)

使用 NSBox,它是 NSView 的一个子类,使我们可以轻松地设计样式

Swift 3

let box = NSBox()
box.boxType = .custom
box.fillColor = NSColor.red
box.cornerRadius = 5

只是小的可重用类(Swift 4.1)

class View: NSView {


var backgroundColor: NSColor?


convenience init() {
self.init(frame: NSRect())
}


override func draw(_ dirtyRect: NSRect) {
if let backgroundColor = backgroundColor {
backgroundColor.setFill()
dirtyRect.fill()
} else {
super.draw(dirtyRect)
}
}
}


// Usage
let view = View()
view.backgroundColor = .white

毫无疑问,这是最简单的方法,也与颜色集资产兼容:

斯威夫特 :

view.setValue(NSColor.white, forKey: "backgroundColor")

目标-C :

[view setValue: NSColor.whiteColor forKey: "backgroundColor"];

Interface Builder

在 Interface Builder 中添加一个用户定义的属性 backgroundColor,类型为 NSColor

这支持在应用程序运行时更改系统范围的外观(打开或关闭暗模式)。如果你首先将视图的类设置为 Background ColorView,你也可以将背景颜色设置为 Interface Builder。


class BackgroundColorView: NSView {
@IBInspectable var backgroundColor: NSColor? {
didSet { needsDisplay = true }
}


override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
wantsLayer = true
}


required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
wantsLayer = true
}


override var wantsUpdateLayer: Bool { return true }


override func updateLayer() {
layer?.backgroundColor = backgroundColor?.cgColor
}
}

只需在图层 上设置 backgroundColor(在使视图层备份之后)。

view.wantsLayer = true
view.layer?.backgroundColor = CGColor.white