Установка backgroundColor пользовательского NSView

Каков процесс рисования в NSView с помощью раскадровки для osx? Я добавил NSView в NSViewController. Затем я добавил несколько ограничений и выход. enter image description here

Затем я добавил код для изменения цвета: import Cocoa

class ViewController: NSViewController {

    @IBOutlet var box: NSView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear() {
        box.layer?.backgroundColor = NSColor.blueColor().CGColor
        //box.layer?.setNeedsDisplay()
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    } 
}

Я хотел бы сделать собственный чертеж и изменить цвета NSView. у меня есть выполнял сложный рисунок на iOS в прошлом, но я полностью застрял здесь. Кто-нибудь видит, что я делаю неправильно?

Ответ 1

Правильный путь

class ViewController: NSViewController {

@IBOutlet var box: NSView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.wantsLayer = true

}

override func viewWillAppear() {
    box.layer?.backgroundColor = NSColor.blue.cgColor
    //box.layer?.setNeedsDisplay()
}

override var representedObject: AnyObject? {
    didSet {
    // Update the view, if already loaded.
    }
}}

Ответ 2

Swift через свойство

extension NSView {

    var backgroundColor: NSColor? {
        get {
            if let colorRef = self.layer?.backgroundColor {
                return NSColor(CGColor: colorRef)
            } else {
                return nil
            }
        }
        set {
            self.wantsLayer = true
            self.layer?.backgroundColor = newValue?.CGColor
        }
    }   
}

Использование:

    yourView.backgroundColor = NSColor.greenColor()

Если ваш вид NSView или любой из его подклассов

Обновлено для Swift 3

extension NSView {

    var backgroundColor: NSColor? {

        get {
            if let colorRef = self.layer?.backgroundColor {
                return NSColor(cgColor: colorRef)
            } else {
                return nil
            }
        }

        set {
            self.wantsLayer = true
            self.layer?.backgroundColor = newValue?.cgColor
        }
    }
}

Ответ 3

редактировать/обновление:

Другой вариант - создать свой собственный цветной вид:

import Cocoa
@IBDesignable class ColoredView: NSView {
    @IBInspectable var backgroundColor: NSColor = .clear
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        backgroundColor.set()
        dirtyRect.fill()
    }
}

Затем вам просто нужно добавить Custom View NSView и установить пользовательский класс в инспекторе:

Custom View

ColoredView

IBInspectable


Оригинальный ответ

Swift 3.0 или более поздняя версия

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))
myView.backgroundColor = .red

Ответ 4

Это работает намного лучше:

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        NSColor.blueColor().setFill()
        NSRectFill(dirtyRect);
    }

Ответ 5

Лучший способ установить цвет фона NSView в MacOS 10.14 с поддержкой темного режима:

1/ Создайте свой цвет в Assets.xcassets enter image description here

2/ Подкласс вашего NSView и добавить это:

class myView: NSView {
    override func updateLayer() {
       self.layer?.backgroundColor = NSColor(named: "customControlColor")?.cgColor
    }
}

Очень простой и темный режим поддерживается с цветом на ваш выбор!

Полное руководство: https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface

Ответ 6

Обновление до Swift 3 решения от @CryingHippo (Он показал цвета не на каждом прогоне в моем случае). Я добавил DispatchQueue.main.async, и теперь он показывает цвета при каждом запуске приложения.

extension NSView {

    var backgroundColor: NSColor? {

        get {
            if let colorRef = self.layer?.backgroundColor {
                return NSColor(cgColor: colorRef)
            } else {
                return nil
            }
        }

        set {

            DispatchQueue.main.async { 

                self.wantsLayer = true
                self.layer?.backgroundColor = newValue?.cgColor

            }

        }
    }
}

Ответ 7

Поскольку macOS 10.13 (High Sierra) NSView отвечает на селектор backgroundColor, хотя он не документирован!