设置自定义NSView的backgroundColor

slc*_*ott 19 nsview xcode-storyboard swift

使用osx的故事板绘制到NSView的过程是什么?我已经在NSViewController中添加了一个NSView.然后,我添加了一些约束和插座. 在此输入图像描述

接下来,我添加了一些代码来改变颜色: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.
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

我想做自定义绘图和更改NSView的颜色.我过去在iOS上进行过复杂的绘图,但我完全陷入困境.有谁看到我做错了什么?

小智 32

正确的方法是

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.
    }
}}
Run Code Online (Sandbox Code Playgroud)


Cry*_*ppo 31

斯威夫特通过财产

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
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

用法:

    yourView.backgroundColor = NSColor.greenColor()
Run Code Online (Sandbox Code Playgroud)

其中yourViewNSView或其任何子类

针对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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 12

Swift 3.0或更高版本

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

  • 这太棒了.我不敢相信我没想到这一点.通过这个简单的扩展,Cocoa中的视图背景现在就像它们在Cocoa Touch中一样简单.:) (3认同)

slc*_*ott 5

这效果更好:

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        NSColor.blueColor().setFill()
        NSRectFill(dirtyRect);
    }
Run Code Online (Sandbox Code Playgroud)