从Cocoa中获取NSColor的十六进制值?

Eug*_*din 4 macos cocoa objective-c nscolor

有谁知道在Cocoa中是否可以从NSColor中获取颜色的十六进制值?

SG1*_*SG1 8

使用蓝色NSColor的示例:

NSColor* color = [NSColor blueColor];

NSString* hexString = [NSString stringWithFormat:@"%02X%02X%02X", 
(int) (color.redComponent * 0xFF), (int) (color.greenComponent * 0xFF), 
(int) (color.blueComponent * 0xFF)];
Run Code Online (Sandbox Code Playgroud)

  • 小心!在所有`NSColor`实例上调用`-redComponent`等并不总是合法的.他们可能会抛出异常.您必须转换为RGB色彩空间并应对失败.您应该看到[技术问答QA1576:如何获取NSColor对象的十六进制值?](http://developer.apple.com/library/mac/#qa/qa1576/_index.html). (8认同)

Tyl*_*ong 8

我喜欢 DAH 的解决方案,我将其设为计算属性而不是函数:

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
    }

}
Run Code Online (Sandbox Code Playgroud)


Osk*_*kar 5

不会因色彩空间问题而崩溃的解决方案:

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
    }
}
Run Code Online (Sandbox Code Playgroud)