【问题标题】:SwiftUI - hex to color not correctSwiftUI - 十六进制颜色不正确
【发布时间】:2021-10-07 12:01:39
【问题描述】:

我编写了一个将十六进制转换为颜色的扩展。添加了断点来检查 r,g,b 值是否正确。一切看起来都很好,但是当我初始化颜色时,它与我提供的十六进制值不一样。

extension Color {

    init(hexColor: String) {
        // Trim all characters excepts Alphanumerics
        let hex = hexColor.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
        let hexNumber = Int(hex, radix: 16) ?? 0
        let redColor: Double = Double((hexNumber >> 16) & 0xFF)
        let greenColor: Double = Double((hexNumber >> 8) & 0xFF)
        let blueColor: Double = Double((hexNumber >> 0) & 0xFF)
        self.init(.sRGB, red: redColor, green: greenColor, blue: blueColor, opacity: 1)
    } }

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    使用的 init 和颜色空间接受 0...1 颜色值。除以 255。

    【讨论】:

    • ??。感谢您的帮助。
    • Klutzes 的想法一样吗?我以前也这样做过,在我的色盲应用中。
    • 另外...仅供参考... Int() 转换不应用您可能期望的舍入规则。您可能需要手动指定从 0.5 向上取整以始终获得白色。
    【解决方案2】:

    解决方案:

    
    extension Color {
        init(hexColor: String) {
            // Trim all characters excepts Alphanumerics
            let hex = hexColor.filter(\.isHexDigit)
            let hexNumber = Int(hex, radix: 16) ?? 0
            let redColor: Double = Double((hexNumber >> 16) & 0xFF) / 255
            let greenColor: Double = Double((hexNumber >> 8) & 0xFF) / 255
            let blueColor: Double = Double((hexNumber >> 0) & 0xFF) / 255
            self.init(.sRGB, red: redColor, green: greenColor, blue: blueColor, opacity: 1)
        }
    }
    

    【讨论】:

    • Double 符合 ExpressibleByIntegerLiteral。所以初始化一个 Double 是没有意义的。 255就够了
    • let hex = hexColor.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) 没有任何意义 Hexa 只使用 0...9 和 A...F。如果您只想保留字符串的十六进制数字,则应过滤所有十六进制数字字符"abcdef0123456789xyz".filter(\.isHexDigit) // "abcdef0123456789"
    猜你喜欢
    • 2019-11-14
    • 2021-02-17
    • 2019-06-16
    • 2021-03-08
    • 2019-10-29
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多