web-dev-qa-db-fra.com

Définition de la couleur d'arrière-plan de NSView personnalisé

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 .enter image description here

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?

13
slcott

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.
    }
}}
32
Sugar

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

yourView est NSView ou l'une de ses sous-classes

Mise à jour pour 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
        }
    }
}
30
CryingHippo

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
9
Leo Dabus

Cela fonctionne beaucoup mieux:

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

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

            }

        }
    }
}
0
Adelmaer

Depuis macOS 10.13 (High Sierra), NSView répond au sélecteur backgroundColor bien que ce ne soit pas documenté!

0
Frank Hintsch

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  enter image description here

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

0
user3722523