Как конвертировать гекс в NSColor?

-1

У меня есть эта функция, которая преобразует цвет в hexString:

public extension NSColor {
    func getHexString() -> String {
        let red = Int(round(self.redComponent * 0xFF))
        let green = Int(round(self.greenComponent * 0xFF))
        let blue = Int(round(self.blueComponent * 0xFF))
        let hexValue = NSString(format: "#%02X%02X%02X", red, green, blue)
        return hexValue
    }
}

Теперь я понятия не имею, как это изменить. Все, что у меня есть, это объектно-кодовый код, но я не могу преобразовать его в быстрый.

 (NSColor*)colorWithHexColorString:(NSString*)inColorString
{
    NSColor* result = nil;
    unsigned colorCode = 0;
    unsigned char redByte, greenByte, blueByte;

    if (nil != inColorString)
    {
         NSScanner* scanner = [NSScanner scannerWithString:inColorString];
         (void) [scanner scanHexInt:&colorCode]; 
    }
    redByte = (unsigned char)(colorCode >> 16);
    greenByte = (unsigned char)(colorCode >> 8);
    blueByte = (unsigned char)(colorCode);

    result = [NSColor
    colorWithCalibratedRed:(CGFloat)redByte
    green:(CGFloat)greenByte 
    blue:(CGFloat)blueByte 
    alpha:1.0];
    return result;
    }
Теги:
macos
cocoa
xcode6

2 ответа

-1
Лучший ответ

Вот точно то же самое с быстрым, однако это использует UIColor, а не NSColor,

func colorWithHexColorString(var colorString: String) -> UIColor?
{
    if colorString.hasPrefix("#") {
        colorString = dropFirst(colorString)
    }

    var color: UIColor? = nil

    var colorCode = UInt32()

    var redByte:CGFloat = 255;
    var greenByte:CGFloat = 255;
    var blueByte: CGFloat = 255;

    let scanner = NSScanner(string: colorString)
    if scanner.scanHexInt(&colorCode) {
        redByte = CGFloat(colorCode & 0xff0000)
        greenByte = CGFloat(colorCode & 0x00ff00)
        blueByte =  CGFloat(colorCode & 0xff)
        color = UIColor(red: redByte, green: greenByte, blue: blueByte, alpha: 1.0)
    }

    return color
}

colorWithHexColorString("#ffff00")
colorWithHexColorString("ff0000")
  • 1
    colorString = colorString.substringWithRange(NSMakeRange(1, colorString.length - 1)) Yecccccch! Вы можете сделать это так много более плотно и разборчиво - и не опуская в Фонд - просто позвонив по телефону dropFirst(colorString) .
  • 0
    Вау, я не знал об этом. Я попытался сделать это так, как это было в Задаче C. Я отредактировал свой ответ. Спасибо @matt.
Показать ещё 7 комментариев
0

Я не могу поверить, что я это делаю, но со всем уважением я был обеспокоен тем, как "безумный 36" прибегал к NSScanner и NSString - все это просто показалось слишком тяжелым - вот и моя "чистая" версия Swift, который на самом деле не является "чистым", потому что в итоге я назвал strtol:

func hexStringToColor(var s:String) -> UIColor {
    if s.hasPrefix("#") { s = dropFirst(s) }
    var arr = [String]()
    for i in stride(from: 0, through: 4, by: 2) {
        let ix = advance(s.startIndex,i)
        let ix2 = advance(s.startIndex,i+1)
        arr.append(s[ix...ix2])
    }
    let rgb = arr.map{CGFloat(strtol($0,nil,16))/255.0}
    return UIColor(red: rgb[0], green: rgb[1], blue: rgb[2], alpha: 1)
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню