Лучший способ изменить цвет фона для NSView - PullRequest
139 голосов
/ 03 июня 2010

Я ищу лучший способ изменить backgroundColor на NSView. Я также хотел бы иметь возможность установить соответствующую alpha маску для NSView. Что-то вроде:

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

Я заметил, что у NSWindow есть этот метод, и я не большой поклонник фоновых опций NSColorWheel или NSImage, но, если они лучшие, желающие использовать.

Ответы [ 17 ]

129 голосов
/ 03 июня 2010

Да, ваш собственный ответ был верным. Вы также можете использовать методы Какао:

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

В Swift:

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()
    }

}
111 голосов
/ 03 октября 2011

Простое, эффективное решение - настроить представление для использования слоя 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;
}

Вот и все!

68 голосов
/ 04 марта 2016

Если вы любитель раскадровки, вот способ, которым вам не нужна строка кода .

Добавьте NSBox в качестве подпредставления для NSView и настройте кадр NSBox так же, как для NSView.

В раскадровке или XIB измените положение заголовка на None, тип поля на Custom , тип границы на «None» и цвет границы на любой, какой захотите.

Вот скриншот:

enter image description here

Это результат:

enter image description here

32 голосов
/ 15 января 2015

Если вы вначале установили для WW значение «Да», вы можете напрямую управлять фоном слоя.

[self.view setWantsLayer:YES];
[self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];
26 голосов
/ 03 июня 2010

Думаю, я понял, как это сделать:

- (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));
}
22 голосов
/ 26 апреля 2013

Я прошел через все эти ответы, и, к сожалению, ни один из них не помог мне. Тем не менее, я нашел этот чрезвычайно простой способ, после часа поиска:)

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);
20 голосов
/ 04 июля 2015

редактировать / обновлять: 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)
7 голосов
/ 30 сентября 2013

Лучшее решение:

- (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);
    }
}
5 голосов
/ 05 апреля 2015

В Свифт:

override func drawRect(dirtyRect: NSRect) {

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

    super.drawRect(dirtyRect)
}
4 голосов
/ 07 марта 2017

Используйте NSBox, который является подклассом NSView, что позволяет нам легко создавать стили

Свифт 3

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