NSColor 是 macOS AppKit 中用来表示颜色的类,等价于 iOS 中的 UIColor。在 macOS 应用用于中设置视图背景、绘图、文字颜色、按钮颜色等。
常见用途
1、设置 NSView 背景颜色:view.layer?.backgroundColor = NSColor.red.cgColor
2、绘图:NSColor.blue.setFill(); path.fill()
3、设置文字颜色:label.textColor = NSColor.labelColor
4、设置图层边框颜色:view.layer?.borderColor = NSColor.gray.cgColor
创建颜色
1、系统内置颜色
NSColor.red
NSColor.blue
NSColor.green
NSColor.black
NSColor.white
NSColor.gray
2、macOS专属系统颜色(自动适配浅/深色)
NSColor.labelColor
NSColor.textColor
NSColor.windowBackgroundColor
NSColor.separatorColor
NSColor.controlAccentColor
这些颜色会根据系统的浅色/深色模式自动调整,非常适合做适配。
3、自定义颜色(RGB)
NSColor(red: 0.5, green: 0.2, blue: 0.7, alpha: 1.0)
所有值都是 CGFloat,范围 0.0 ~ 1.0。
4、灰度颜色
NSColor(white: 0.8, alpha: 1.0) // 浅灰色
填充颜色方式
1、使用cgColor实现图层填充
这种方式设置的是 CALayer 的属性,适用于需要快速设置背景色、圆角、边框、阴影等:
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.systemGreen.cgColor
view.layer?.cornerRadius = 8
2、使用set(填充+描边)
同时设置填充色 + 描边色,等价于 setFill + setStroke。
NSColor.orange.set()
let path = NSBezierPath(ovalIn: NSRect(x: 10, y: 10, width: 80, height: 80))
path.fill() // 填充用 orange
path.stroke() // 描边也用 orange
3、使用 .setFill 和 setStroke 分别填充和描边
用于在 draw(_:) 方法中做自定义绘图:
override func draw(_ dirtyRect: NSRect) {
NSColor.red.setFill()
NSColor.black.setStroke()
let path = NSBezierPath(ovalIn: NSRect(x: 10, y: 10, width: 100, height: 100))
path.fill() // 填充是红色
path.stroke() // 边框是黑色
}
NSColor.set()是如何实现的颜色填充?
NSColor.orange.set()
NSBezierPath.fill(NSRect(x: 0, y: 0, width: 100, height: 100))
当调用NSColor.set()时,会设置当前绘图状态上下文的填充和描边颜色。
使用fill(rect)会调用默认颜色填充路径。
提示:颜色状态是全局性的。
macOS 的 NSGraphicsContext 会保留当前设置的颜色状态,一旦调用了 .set() 或 .setFill(),它就会影响后续所有绘图调用,直到再次修改颜色。
使用场景
1、设置视图背景颜色
let view = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.systemTeal.cgColor
2、在绘图中使用NSColor
override func draw(_ dirtyRect: NSRect) {
let rect = NSRect(x: 10, y: 10, width: 80, height: 80)
NSColor.red.setFill()
rect.fill()
}
3、实现动态颜色(浅色/深色模式)
let adaptiveColor = NSColor { appearance in
return appearance.name == .darkAqua ? NSColor.white : NSColor.black
}
或者使用系统颜色自动适配:
view.layer?.backgroundColor = NSColor.windowBackgroundColor.cgColor
总结
NSColor可以创建颜色,支持系统颜色、自定义RGB、灰度或动态色。
可以使用 .setFill() 填充、.setStroke() 描边和 .set() 填充+描边。
在图层/视图颜色中,使用 .cgColor 设置 Layer 的颜色。