Установка 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, хотя он не документирован!