159

我正在寻找改变backgroundColor. NSView我还希望能够alphaNSView. 就像是:

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

我注意到有这种方法,我不是, 或background 选项NSWindow的忠实粉丝,但如果它们是最好的,愿意使用。NSColorWheelNSImage

4

18 回答 18

141

是的,你自己的答案是对的。您还可以使用 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()
    }

}
于 2010-06-03T01:55:42.217 回答
120

一个简单有效的解决方案是将视图配置为使用 Core Animation 层作为其后备存储。然后你可以-[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;
}

而已!

于 2011-10-03T12:49:59.097 回答
94

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

作为子视图添加NSBox到 NSView 并调整 NSBox 的框架与 NSView 相同。

在 Storyboard 或 XIB 中,将 Title 位置更改为 None,将 Box 类型更改为Custom,将 Border Type 更改为“None”,并将边框颜色更改为您喜欢的任何颜色。

这是一个屏幕截图:

在此处输入图像描述

这是结果:

在此处输入图像描述

于 2016-03-04T07:05:48.163 回答
38

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

[self.view setWantsLayer:YES];
[self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];
于 2015-01-15T00:10:25.353 回答
26

想我想出了如何做到这一点:

- (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));
}
于 2010-06-03T01:41:45.513 回答
22

我经历了所有这些答案,但不幸的是,没有一个对我有用。但是,经过大约一个小时的搜索,我发现了这种非常简单的方法:)

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);
于 2013-04-26T01:39:58.983 回答
21

编辑/更新: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)
于 2015-07-03T21:40:30.750 回答
7

最佳解决方案:

- (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);
    }
}
于 2013-09-30T09:52:02.820 回答
6

在斯威夫特:

override func drawRect(dirtyRect: NSRect) {

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

    super.drawRect(dirtyRect)
}
于 2015-04-05T09:51:48.730 回答
6

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

斯威夫特 3

let box = NSBox()
box.boxType = .custom
box.fillColor = NSColor.red
box.cornerRadius = 5
于 2017-03-06T22:31:14.767 回答
6

只需backgroundColor在图层上设置(在支持视图图层之后)。

view.wantsLayer = true
view.layer?.backgroundColor = CGColor.white
于 2020-01-26T17:43:57.700 回答
5

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

view.wantsLayer = true
view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor
于 2015-05-17T01:55:31.837 回答
5

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

斯威夫特

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

目标-C

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

界面生成器

backgroundColor在界面构建器中添加一个用户定义的属性,类型为NSColor.

于 2018-11-08T10:34:42.813 回答
3

在 Swift 3 中,您可以创建一个扩展来执行此操作:

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

// how to use
btn.setBackgroundColor(NSColor.gray)
于 2016-12-11T05:49:21.267 回答
2

迅速你可以继承 NSView 并做到这一点

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

        self.wantsLayer = true;
        self.layer?.backgroundColor = NSColor.redColor().CGColor;
    }
}
于 2015-08-21T06:45:41.043 回答
2

这支持在应用程序运行时更改系统范围的外观(打开或关闭暗模式)。如果您先将视图的类设置为 BackgroundColorView,您还可以在 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
    }
}
于 2019-03-09T22:46:13.683 回答
1

看看RMSkinnedView。您可以在 Interface Builder 中设置 NSView 的背景颜色。

于 2013-08-08T15:07:08.327 回答
1

只是小的可重用类(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
于 2018-01-29T21:56:32.330 回答