有人知道在Cocoa中是否可以从NSColor获取十六进制颜色值吗?
使用蓝色NSColor的示例:
NSColor* color = [NSColor blueColor];
NSString* hexString = [NSString stringWithFormat:@"%02X%02X%02X",
(int) (color.redComponent * 0xFF), (int) (color.greenComponent * 0xFF),
(int) (color.blueComponent * 0xFF)];
我喜欢D.A.H的解决方案,我将其作为计算属性而不是函数:
import Cocoa
extension NSColor {
var hexString: String {
let red = Int(round(self.redComponent * 0xFF))
let green = Int(round(self.greenComponent * 0xFF))
let blue = Int(round(self.blueComponent * 0xFF))
let hexString = NSString(format: "#%02X%02X%02X", red, green, blue)
return hexString as String
}
}
NSColor
不在RGB颜色空间中,则会引发Objective-C异常 - Duncan的答案可以缓解此问题:https://dev59.com/UnDYa4cB1Zd3GeqPDK8E#51839877 - Alex Rozanski一种不会因颜色空间问题而崩溃的解决方案:
import Cocoa
extension NSColor {
var hexString: String {
guard let rgbColor = usingColorSpaceName(NSColorSpaceName.calibratedRGB) else {
return "#FFFFFF"
}
let red = Int(round(rgbColor.redComponent * 0xFF))
let green = Int(round(rgbColor.greenComponent * 0xFF))
let blue = Int(round(rgbColor.blueComponent * 0xFF))
let hexString = NSString(format: "#%02X%02X%02X", red, green, blue)
return hexString as String
}
}
一个选项是创建一个扩展到 NSColor 的扩展。
public extension NSColor {
func getHexString() -> String {
let red = Int(round(self.redComponent * 0xFF))
let grn = Int(round(self.greenComponent * 0xFF))
let blu = Int(round(self.blueComponent * 0xFF))
let hexString = NSString(format: "#%02X%02X%02X", red, grn, blu)
return hexString
}
}
已更新至 Swift 4 版本
extension NSColor {
var hexString: String {
guard let rgbColor = usingColorSpaceName(NSColorSpaceName.calibratedRGB) else {
return "FFFFFF"
}
let red = Int(round(rgbColor.redComponent * 0xFF))
let green = Int(round(rgbColor.greenComponent * 0xFF))
let blue = Int(round(rgbColor.blueComponent * 0xFF))
let hexString = NSString(format: "#%02X%02X%02X", red, green, blue)
return hexString as String
}
}
usingColorSpace(NSColorSpace. ...)
。 - Sebastian支持灰度色彩:
func toHex(alpha: Bool = false) -> String? {
if let components = cgColor.components, components.count == 2 {
let g = Float(components[0])
let a = Float(components[1])
if alpha {
return String(format: "%02lX%02lX%02lX%02lX", lroundf(g * 255), lroundf(g * 255), lroundf(g * 255), lroundf(a * 255))
} else {
return String(format: "%02lX%02lX%02lX", lroundf(g * 255), lroundf(g * 255), lroundf(g * 255))
}
}
guard let components = cgColor.components, components.count >= 3 else {
return nil
}
let r = Float(components[0])
let g = Float(components[1])
let b = Float(components[2])
var a = Float(1.0)
if components.count >= 4 {
a = Float(components[3])
}
if alpha {
return String(format: "%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255))
} else {
return String(format: "%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255))
}
}
NSColor
实例上调用-redComponent
等并不总是合法的,它们可能会抛出异常。你需要将其转换为 RGB 颜色空间并处理失败情况。你应该参见 Technical Q&A QA1576: How do I get the hexadecimal value of an NSColor object?。 - Ken ThomasesusingColorSpace(:)
方法进行修复。 - Joseph