【问题标题】:Swift 5.4 hex to NSColorSwift 5.4 hex 到 NSColor
【发布时间】:2021-10-11 05:37:44
【问题描述】:

我正在为 macOS 开发一个程序。

我需要将十六进制颜色转换为 NSColor。

我在这里查看了建议的解决方案:

Convert Hex Color Code to NSColor

How to convert hex to NSColor?

但这些都不能在 Xcode 12.5.1 上正常工作。

在我这样做的那一刻,它工作正常:

extension NSObject {
    func RGB(r:CGFloat, g:CGFloat, b:CGFloat, alpha:CGFloat? = 1) -> NSColor {
        return NSColor(red: r/255, green: g/255, blue: b/255, alpha: alpha!)
    }
}

let fillColor = RGB(r: 33, g: 150, b: 243)

可能不必使用 Cocoa。

我想要这样的函数:hexToNSColor("#2196f3")

你能帮帮我吗?

【问题讨论】:

  • 永远不要忘记先转换为 RGB 颜色空间(链接中的代码不会这样做)
  • 问题是十六进制到 NSColor 不是从 NSColor 获取十六进制作为引用的答案。
  • @Paul,我有一个可能的答案,但不能在这里发布,因为“他们”关闭了它。问另一个问题,例如:“Swift 5.4 hex to NSColor NOT hex value from NSColor in cocoa”
  • 嘿,看来我可以重新打开问题,然后发布我的答案。希望它在这一切之后有所帮助。
  • @workingdog 我错过了。你有我的回答。但这是一个常见的问题,不应该重新打开。应该用正确的链接评论为重复。除了它的 UIColor 与 NSColor。甚至 XCode 现在也可以建议解决这个问题。

标签: swift macos hex nscolor


【解决方案1】:

你可以试试这样的:

编辑:包括 toHex(alpha:),来自我可能多年前从网上某处获得的代码。

EDIT3,4:包括#RRGGBBAA 的案例

编辑 5:去除十六进制字符串中的空格,使 NSColor (hex:" # 2196f380 ") 也能正常工作。

extension NSColor {
    
 convenience init(hex: String) {
    let trimHex = hex.trimmingCharacters(in: .whitespacesAndNewlines)
    let dropHash = String(trimHex.dropFirst()).trimmingCharacters(in: .whitespacesAndNewlines)
    let hexString = trimHex.starts(with: "#") ? dropHash : trimHex
    let ui64 = UInt64(hexString, radix: 16)
    let value = ui64 != nil ? Int(ui64!) : 0
    // #RRGGBB
    var components = (
        R: CGFloat((value >> 16) & 0xff) / 255,
        G: CGFloat((value >> 08) & 0xff) / 255,
        B: CGFloat((value >> 00) & 0xff) / 255,
        a: CGFloat(1)
    )
    if String(hexString).count == 8 {
        // #RRGGBBAA
        components = (
            R: CGFloat((value >> 24) & 0xff) / 255,
            G: CGFloat((value >> 16) & 0xff) / 255,
            B: CGFloat((value >> 08) & 0xff) / 255,
            a: CGFloat((value >> 00) & 0xff) / 255
        )
    }
    self.init(red: components.R, green: components.G, blue: components.B, alpha: components.a)
}

func toHex(alpha: Bool = false) -> String? {
    guard let components = cgColor.components, components.count >= 3 else {
        return nil
    }
    
    let r = Float(components[0])
    let g = Float(components[1])
    let b = Float(components[2])
    var a = Float(1.0)
    
    if components.count >= 4 {
        a = Float(components[3])
    }
    
    if alpha {
        return String(format: "%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255))
    } else {
        return String(format: "%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255))
    }
}
}
 
    let nscol = NSColor(hex: "#2196f3")  // <-- with or without #

EDIT2:

您可以对 UIColor 和 Color(使用 UIColor 或 NSColor)执行相同的操作:

extension Color {
    public init(hex: String) {
        self.init(UIColor(hex: hex))
    }

    public func toHex(alpha: Bool = false) -> String? {
        UIColor(self).toHex(alpha: alpha)
    }
}

【讨论】:

  • 我打赌 op 会要求解决这个问题,因为它不接受 NSColor(hex: "#2196f3")
  • 是的,看来我今天选择了错误的问题来尝试回答。
  • @workingdog:完美,一些好奇心。 1)用三元运算符写这个函数会不会有问题?第二部分带有self.init 的部分可以使用三元运算符编写,或者最好不要编写。链接:pastebin.com/RuiV5SLf 2) 如果你也想考虑alpha 我该怎么办?
  • 用 alpha 代码更新了我的答案。至于三元,我把它留作练习。
  • 添加了可能使用的三元。
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多