【发布时间】:2019-02-05 13:36:19
【问题描述】:
有谁知道是否可以从 Cocoa 中的 NSColor 获取颜色的十六进制值?
【问题讨论】:
标签: objective-c macos cocoa nscolor
有谁知道是否可以从 Cocoa 中的 NSColor 获取颜色的十六进制值?
【问题讨论】:
标签: objective-c macos 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)];
【讨论】:
NSColor 实例上调用-redComponent 等并不总是合法的。他们可能会抛出异常。您必须转换为 RGB 颜色空间并应对失败。你应该看到Technical Q&A QA1576: How do I get the hexadecimal value of an NSColor object?。
usingColorSpace(:)方法修复
我喜欢 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
}
}
【讨论】:
不会因色彩空间问题而崩溃的解决方案:
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
}
}
【讨论】:
sRGB,因为它用于Web Colors
一个选项是为 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. ...)。