如何使用 Swift 在 Cocoa 应用程序中设置 NSView 的颜色?
How to set color of NSView in Cocoa App using Swift?
我曾经为 iOS 开发,但我不明白为什么我不能在主视图中轻松更改 NSView
的背景颜色。
假设我有一个带有主视图的视图控制器。在此视图中,我添加了 3 个自定义视图,我设置了它们的约束以适合主视图。
我已经为我的视图控制器创建了 3 个出口:
@IBOutlet weak var topView: NSView!
@IBOutlet weak var leftView: NSView!
@IBOutlet weak var rightView: NSView!
之后,我试图设置这些视图的背景,但无法执行此操作。当我 运行 应用程序时,我没有看到任何颜色变化。
这是我添加的用于显示自定义视图颜色的代码:
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
}
它什么也没显示(我的视图没有背景颜色):
我不明白为什么这段代码不起作用。为什么设置 NSView
的颜色如此困难(而在 iOS 开发中却如此容易)?我正在使用 Xcode 8 并使用 Swift 3.
编写代码
您应该将 wantsLayer
设置为 true
用于您的 子视图 ,而不是您的父视图。
self.topView.wantsLayer = true
self.rightView.wantsLayer = true
self.leftView.wantsLayer = true
图层方法很方便,但它会产生一个可怕的问题,除非你有一个非常暗的背景和明亮的文本颜色(反之亦然......我不记得哪个是哪个了。)一个 NSTextField 标签。与 Cocoa Touch 不同,它允许您更改 UIView 对象的背景颜色,不幸的是,您必须在 Cocoa 中子class NSView 才能确定,如下所示。
import Cocoa
class RedView: NSView {
override func draw(_ rect: NSRect) {
super.draw(rect)
let color = NSColor.red
color.set()
NSRectFill(rect)
}
}
然后根据您在界面生成器的身份检查器下对子class(此处为 RedView)的称呼来设置 class 名称。如果您想以编程方式更改背景颜色,请连接视图对象。然后执行如下操作。
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)
我曾经为 iOS 开发,但我不明白为什么我不能在主视图中轻松更改 NSView
的背景颜色。
假设我有一个带有主视图的视图控制器。在此视图中,我添加了 3 个自定义视图,我设置了它们的约束以适合主视图。
我已经为我的视图控制器创建了 3 个出口:
@IBOutlet weak var topView: NSView!
@IBOutlet weak var leftView: NSView!
@IBOutlet weak var rightView: NSView!
之后,我试图设置这些视图的背景,但无法执行此操作。当我 运行 应用程序时,我没有看到任何颜色变化。
这是我添加的用于显示自定义视图颜色的代码:
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
}
它什么也没显示(我的视图没有背景颜色):
我不明白为什么这段代码不起作用。为什么设置 NSView
的颜色如此困难(而在 iOS 开发中却如此容易)?我正在使用 Xcode 8 并使用 Swift 3.
您应该将 wantsLayer
设置为 true
用于您的 子视图 ,而不是您的父视图。
self.topView.wantsLayer = true
self.rightView.wantsLayer = true
self.leftView.wantsLayer = true
图层方法很方便,但它会产生一个可怕的问题,除非你有一个非常暗的背景和明亮的文本颜色(反之亦然......我不记得哪个是哪个了。)一个 NSTextField 标签。与 Cocoa Touch 不同,它允许您更改 UIView 对象的背景颜色,不幸的是,您必须在 Cocoa 中子class NSView 才能确定,如下所示。
import Cocoa
class RedView: NSView {
override func draw(_ rect: NSRect) {
super.draw(rect)
let color = NSColor.red
color.set()
NSRectFill(rect)
}
}
然后根据您在界面生成器的身份检查器下对子class(此处为 RedView)的称呼来设置 class 名称。如果您想以编程方式更改背景颜色,请连接视图对象。然后执行如下操作。
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)