如何使用Swift在Cocoa App中设置NSView的颜色?

时间:2017-09-07 10:36:37

标签: swift macos cocoa nsview

我曾经为iOS开发,我不明白为什么我不能轻易改变主视图中NSView的背景颜色。

假设我有一个带有主视图的视图控制器。在这个视图中,我添加了3个自定义视图,我已经设置了它们的约束以适应主视图。

我为我的视图控制器创建了3个插座:

@IBOutlet weak var topView: NSView!
@IBOutlet weak var leftView: NSView!
@IBOutlet weak var rightView: NSView!

3 views in IB

之后,我正在尝试设置这些视图的背景而不能这样做。运行应用程序时,我看不到任何颜色变化。

以下是我为自定义视图显示颜色时添加的代码:

override func viewDidLoad() {
        super.viewDidLoad()

        self.view.wantsLayer = true

        self.topView.layer?.backgroundColor = NSColor.blue.cgColor
        self.rightView.layer?.backgroundColor = NSColor.green.cgColor
        self.leftView.layer?.backgroundColor = NSColor.yellow.cgColor
    }

它没有显示任何内容(我的观点没有背景颜色):

no background color on views

我无法理解为什么这段代码不起作用。为什么设置NSView的颜色这么难(虽然在iOS开发中这么容易)?我正在使用Xcode 8并使用Swift 3编写代码。

2 个答案:

答案 0 :(得分:3)

您应该为{strong>子视图将wantsLayer设置为true,而不是为您的超级视图设置。

self.topView.wantsLayer = true
self.rightView.wantsLayer = true
self.leftView.wantsLayer = true

答案 1 :(得分:0)

图层方法很方便,但它会产生一个可怕的问题,除非你的背景非常深,背景是明亮的颜色(反之亦然......我不记得哪个是哪个。)一个NSTextField标签。不像Cocoa Touch,它允许你改变UIView对象的背景颜色,不幸的是,你必须在Cocoa中继承NSView以确定如下。

import Cocoa

class RedView: NSView {
    override func draw(_ rect: NSRect) {
        super.draw(rect)

        let color = NSColor.red
        color.set()
        NSRectFill(rect)
    }
}

然后根据您在接口构建器的身份检查器下调用子类(此处为RedView)的任何内容设置类名。如果要以编程方式更改背景颜色,请将视图对象连接起来。然后执行以下操作。

import Cocoa

class MyView: NSView {
    // MARK: - Variables
    var backgroundColor = NSColor()

    // MARK: - Draw
    override func draw(_ rect:NSRect) {
        super.draw(rect)
        backgroundColor.set()
        NSRectFill(rect)
    }

    // MARK: - Method
    func changeBackgroundColor(color: NSColor) {
        backgroundColor = color
        setNeedsDisplay(self.bounds)
    }
}

然后,您可以从视图控制器调用changeBackgroundColor,如...

@IBOutlet weak var myView: MyView!
myView.changeBackgroundColor(color: NSColor.green)