OSXのストーリーボードを使用してNSViewに描画するプロセスは何ですか? NSViewをNSViewControllerに追加しました。次に、いくつかの制約とアウトレットを追加しました。
次に、色を変更するためのコードを追加しました。インポート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で洗練された描画を実行しましたが、完全にここで立ち往生しています。誰かが私が間違っていることを見ていますか?
正しい方法は
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.
}
}}
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()
yourViewはNSViewまたはそのサブクラスのいずれかです
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
}
}
}
編集/更新:
別のオプションは、独自の色付きビューを設計することです:
import Cocoa
@IBDesignable class ColoredView: NSView {
@IBInspectable var backgroundColor: NSColor = .clear
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
backgroundColor.set()
dirtyRect.fill()
}
}
次に、カスタムビューNSView
を追加し、インスペクターでカスタムクラスを設定するだけです。
元の回答
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
これは非常によく機能します:
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
NSColor.blueColor().setFill()
NSRectFill(dirtyRect);
}
NSViewの背景色をMacOS 10.14でdark modeに設定する最良の方法サポート :
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
@ = 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
}
}
}
}
MacOS 10.13(High Sierra)以降、NSViewはセレクターbackgroundColorに応答しますが、文書化されていません!