【问题标题】:How to convert hex to NSColor?如何将十六进制转换为 NSColor?
【发布时间】:2015-02-10 09:00:10
【问题描述】:

我有这个函数可以在 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
    }
}

现在,我不知道如何扭转这种情况。 我只有这个objective-c代码,但我无法将它转换为swift。

 (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 swift xcode6


    【解决方案1】:

    这里和 swift 完全一样,但是这里使用的是 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")
    

    【讨论】:

    • colorString = colorString.substringWithRange(NSMakeRange(1, colorString.length - 1)) Yecccccch!您可以so 更紧密、更清晰地做到这一点 - 无需进入 Foundation - 只需调用 dropFirst(colorString)
    • 哇,我不知道。我尝试按照过去在 Objective C 中的方式进行操作。我编辑了我的答案。谢谢@matt。
    • 我正要说你应该使用String
    • 我现在做到了。 @LeonardoSavioDabus
    • 谢谢。看来我现在有一个新问题。返回的颜色和开始的颜色不一样。
    【解决方案2】:

    我不敢相信我正在这样做,但恕我直言,我对“insane-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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多