Получение шестнадцатеричного значения из NSColor в Cocoa?

Кто-нибудь знает, можно ли получить шестнадцатеричное значение цвета из NSColor в Cocoa?


person Eugene Gordin    schedule 08.04.2013    source источник


Ответы (5)


Пример использования синего цвета NSColor:

NSColor* color = [NSColor blueColor];

NSString* hexString = [NSString stringWithFormat:@"%02X%02X%02X", 
(int) (color.redComponent * 0xFF), (int) (color.greenComponent * 0xFF), 
(int) (color.blueComponent * 0xFF)];
person SG1    schedule 08.04.2013
comment
Будь осторожен! Не всегда допустимо вызывать -redComponent и т. д. для всех экземпляров NSColor. Они могут выдать исключение. Вы должны преобразовать в цветовое пространство RGB и справиться с ошибкой. Вы должны увидеть Технические вопросы и ответы QA1576: как получить шестнадцатеричное значение объект NSColor?. - person Ken Thomases; 09.04.2013
comment
Это можно исправить с помощью метода usingColorSpace(:) - person juniorRubyist; 31.12.2018

Мне нравится решение 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
    }

}
person Tyler Long    schedule 02.09.2015

Решение, которое не дает сбоев из-за проблем с цветовым пространством:

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
    }
}
person Oskar    schedule 11.09.2016
comment
Коррекция цветового пространства изменяет цвет (в сторону черного на моей машине), создавая немного неправильную шестнадцатеричную строку. - person Alex; 24.05.2017
comment
Цветовое пространство должно быть sRGB, поскольку оно используется для веб-цветов. - person pointum; 26.02.2019

Вариант - создать расширение для 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
    }
}
person D.A.H    schedule 10.12.2014

Обновлено для 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
    }

}
person Duncan Groenewald    schedule 14.08.2018