如何从Color SwiftUI获取RGB组件

Div*_*Div 5 rgb colors swift swiftui

如果我有一个SwiftUI Color

let col: Color = Color(red: 0.5, green: 0.5, blue: 0.5)
Run Code Online (Sandbox Code Playgroud)

如何从中获取RGB分量col
像这样:

print(col.components.red)
Run Code Online (Sandbox Code Playgroud)

在UIKit中,我可以使用,UIColor.getRed但SwiftUI中似乎没有等效项。

Moj*_*ini 14

iOS 14 / macOS 10.16

有一个新的初始化,需要一个Color和返回UIColor的iOSNSColor用于MacOS的现在。在这些人的帮助下,您可以实现以下扩展:

iOS / macOS

import SwiftUI

#if canImport(UIKit)
import UIKit
#elseif canImport(AppKit)
import AppKit
#endif

extension Color {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, opacity: CGFloat) {

        #if canImport(UIKit)
        typealias NativeColor = UIColor
        #elseif canImport(AppKit)
        typealias NativeColor = NSColor
        #endif

        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var o: CGFloat = 0

        guard NativeColor(self).getRed(&r, green: &g, blue: &b, alpha: &o) else {
            // You can handle the failure here as you want
            return (0, 0, 0, 0)
        }

        return (r, g, b, o)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

Color.red.components.red // 0.9999999403953552 // <- SwiftUI Colors are not pure!
Run Code Online (Sandbox Code Playgroud)


mar*_*nio 14

简单的一行:

print(UIColor(Color.blue).cgColor.components)
Run Code Online (Sandbox Code Playgroud)

你会得到一个[CGFloat]?[红、绿、蓝、alpha]。

更新

用于NSColormacOS


Nic*_*zzi 6

等待 API 我滥用CustomStringConvertible了简单 rgba 案例的协议,其中颜色描述格式为 #rrggbbaa

debugPrint(Color.red)
debugPrint(Color(red: 1.0, green: 0.0, blue: 0.0))
debugPrint(Color(red: 1.0, green: 0.3, blue: 0.0))
debugPrint(Color(.sRGB, red: 1.0, green: 0.0, blue: 0.5, opacity: 0.3))
debugPrint(Color(hue: 1.0, saturation: 0.0, brightness: 1.0))
debugPrint(Color(.displayP3, red: 1.0, green: 0.0, blue: 0.0, opacity: 1.0).description)

red
#FF0000FF
#FF4C00FF
#FF00804D
#FFFFFFFF
"DisplayP3(red: 1.0, green: 0.0, blue: 0.0, opacity: 1.0)"
Run Code Online (Sandbox Code Playgroud)

如您所见,Color.red 之类的东西只是转储“红色”,但是如果您正在使用由代码(即来自颜色选择器)生成的简单 RGB 颜色,那么这还不错

extension SwiftUI.Color {
    var redComponent: Double? {
        let val = description
        guard val.hasPrefix("#") else { return nil }
        let r1 = val.index(val.startIndex, offsetBy: 1)
        let r2 = val.index(val.startIndex, offsetBy: 2)
        return Double(Int(val[r1...r2], radix: 16)!) / 255.0
    }

    var greenComponent: Double? {
        let val = description
        guard val.hasPrefix("#") else { return nil }
        let g1 = val.index(val.startIndex, offsetBy: 3)
        let g2 = val.index(val.startIndex, offsetBy: 4)
        return Double(Int(val[g1...g2], radix: 16)!) / 255.0
    }

    var blueComponent: Double? {
        let val = description
        guard val.hasPrefix("#") else { return nil }
        let b1 = val.index(val.startIndex, offsetBy: 5)
        let b2 = val.index(val.startIndex, offsetBy: 6)
        return Double(Int(val[b1...b2], radix: 16)!) / 255.0
    }

    var opacityComponent: Double? {
        let val = description
        guard val.hasPrefix("#") else { return nil }
        let b1 = val.index(val.startIndex, offsetBy: 7)
        let b2 = val.index(val.startIndex, offsetBy: 8)
        return Double(Int(val[b1...b2], radix: 16)!) / 255.0
    }
}
Run Code Online (Sandbox Code Playgroud)