web-dev-qa-db-ja.com

カスタムNSViewのbackgroundColorの設定

OSXのストーリーボードを使用してNSViewに描画するプロセスは何ですか? NSViewをNSViewControllerに追加しました。次に、いくつかの制約とアウトレットを追加しました。 enter image description here

次に、色を変更するためのコードを追加しました。インポート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で洗練された描画を実行しましたが、完全にここで立ち往生しています。誰かが私が間違っていることを見ていますか?

19
slcott

正しい方法は

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

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

yourViewNSViewまたはそのサブクラスのいずれかです

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
        }
    }
}
31
CryingHippo

編集/更新:

別のオプションは、独自の色付きビューを設計することです:

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

次に、カスタムビュー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
12
Leo Dabus

これは非常によく機能します:

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

NSViewの背景色をMacOS 10.14dark modeに設定する最良の方法サポート :

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

2
user3722523

@ = CryingHippoによるSwift 3ソリューションへの更新(私の場合、実行ごとに色が表示されない)。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

            }

        }
    }
}
1
Adelmaer

MacOS 10.13(High Sierra)以降、NSViewはセレクターbackgroundColorに応答しますが、文書化されていません!

0
Frank Hintsch