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

Posted

技术标签:

【中文标题】如何使用 Swift 在 Cocoa App 中设置 NSView 的颜色?【英文标题】:How to set color of NSView in Cocoa App using Swift? 【发布时间】:2017-09-07 10:36:36 【问题描述】:

我曾经为 ios 开发,我不明白为什么我不能在主视图中轻松更改 NSViews 的背景颜色。

假设我有一个视图控制器,其中包含一个主视图。在这个视图中,我添加了 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 编写代码。

【问题讨论】:

这不是改变底层视图背景颜色的好方法。根据背景颜色和文本颜色,NSTextField 标签的文本可能会模糊。 有什么好办法? 【参考方案1】:

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

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

【讨论】:

天哪,太容易了。谢谢,在 10 分钟内我会接受这个作为正确答案。顺便说一句,这是改变 NSViews 颜色的唯一方法吗? @Adelmaer 这是最简单的方法。您可以编写一个扩展来为您执行此操作,只需一行。详情here. 哦,很棒的链接,谢谢,顺便说一句,这很奇怪,但是当我为 Swift 3 实现扩展解决方案并按下运行时,它并不是在每次运行时都显示颜色。所以我添加了 DispatchQueue.main.async 来设置,之后它开始在每次运行时显示颜色。【参考方案2】:

图层方法很方便,但它会产生一个可怕的问题,除非你有一个非常黑暗的背景再次明亮的文本颜色(反之亦然......我不记得哪个是哪个了。)对于 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)

【讨论】:

谢谢,我也试试你的方法!

以上是关于如何使用 Swift 在 Cocoa App 中设置 NSView 的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

在Swift Cocoa App中实现“打开文件”

在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器

Swift App 委托->ViewController Cocoa

在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐

如何使用 Cocoa (Mac) 在 Swift 中创建 PDF

如何使用 Storyboards/Cocoa 在 Swift 3.x 中引用视图的窗口