Quel est le processus de création de NSView à l'aide de storyboards pour osx? J'ai ajouté un NSView au NSViewController. Ensuite, j'ai ajouté quelques contraintes et un exutoire .
Ensuite, j'ai ajouté du code pour changer la couleur: 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.
}
}
}
Je voudrais faire un dessin personnalisé et changer les couleurs de NSView. J'ai déjà réalisé des dessins sophistiqués sur iOS dans le passé, mais je suis totalement coincé ici. Est-ce que quelqu'un voit ce que je fais mal?
La bonne façon est
class ViewController: NSViewController {
@IBOutlet var box: NSView!
override func viewDidLoad() {
super.viewDidLoad()
self.view.wantsLayer = true
}
override func viewWillAppear() {
box.layer?.backgroundColor = NSColor.blueColor().CGColor
//box.layer?.setNeedsDisplay()
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}}
Swift via la propriété
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
}
}
}
Usage:
yourView.backgroundColor = NSColor.greenColor()
Où yourView est NSView ou l'une de ses sous-classes
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
}
}
}
Swift 3.0 ou version ultérieure
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
Cela fonctionne beaucoup mieux:
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
NSColor.blueColor().setFill()
NSRectFill(dirtyRect);
}
Mise à jour de la solution Swift 3 par @CryingHippo (les couleurs n'étaient pas affichées à chaque fois dans mon cas). J'ai ajouté DispatchQueue.main.async et maintenant, il affiche les couleurs à chaque exécution de l'application.
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
}
}
}
}
Depuis macOS 10.13 (High Sierra), NSView répond au sélecteur backgroundColor bien que ce ne soit pas documenté!
Meilleure façon de définir une couleur d’arrière-plan NSView dans MacOS 10.14 avec la prise en charge du mode dark:
1/ Créez votre couleur dans Assets.xcassets
2/ Sous-classez votre NSView et ajoutez ceci:
class myView: NSView {
override func updateLayer() {
self.layer?.backgroundColor = NSColor(named: "customControlColor")?.cgColor
}
}
Mode très simple et sombre pris en charge avec la couleur de votre choix!
Guide complet: https://developer.Apple.com/documentation/appkit/supporting_dark_mode_in_y_interface