如何将 UIColor 转换为 SwiftUI 的颜色

Posted

技术标签:

【中文标题】如何将 UIColor 转换为 SwiftUI 的颜色【英文标题】:How to convert UIColor to SwiftUI‘s Color 【发布时间】:2019-11-21 11:36:14 【问题描述】:

我想使用 UIColor 作为对象的前景色,但我不知道如何将 UIColor 转换为 Color

var myColor: UIColor
RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor))

【问题讨论】:

我知道我可以使用单个属性,但我认为可能有更简单的方法 我明白了,但苹果可能已经为我提供了一种方法,所以我认为询问是合法的。如果您不这么认为,我很抱歉 我后来发现没有内置强制,这就是为什么我接受了帮助其他人解决同样问题的答案。 【参考方案1】:

从 beta 5 开始,您可以从 UIColor 创建颜色:

Color(UIColor.systemBlue)

【讨论】:

我可以确认这是可行的,如果 UIColor 是自定义动态颜色,那么 Color 也是动态的。 值得注意的是你可以写:Color(.systemBlue) 你会怎么做反过来,颜色到 UIColor? 我不得不使用 SwiftUI.Color(myUIColor)【参考方案2】:

ios 和 macOS

Color 有一个本地初始化程序,它接受 UIColorNSColor 作为参数:

Color(.red) /* or any other UIColor/NSColor you need INSIDE parentheses */

请勿明确调用Color(UIColor.red)!!!。这会将您的 SwiftUI 代码耦合到 UIKit。相反,只需调用 Color(.red) 即可自动推断出正确的模块。

另外,请注意这个区别:

Color.red     /* this `red` is SwiftUI native `red` */
Color(.red)   /* this `red` is UIKit `red` */

请注意:

Color.redUIColor.red 相同!它们具有不同的值并且彼此看起来不同。所以不要假设 这毫无价值

这些是相等的:SwiftUI.Color.Red == UIKit.UIColor.systemRed

另外,您可以查看How to get RGB components from SwiftUI.Color


扩展

您可以为其实现自定义变量,使其更像cgColorciColor

extension UIColor 
    /// The SwiftUI color associated with the receiver.
    var suColor: Color  Color(self) 

所以它会是这样的:

UIColor.red         // UIKit color
UIColor.red.suColor // SwiftUI color
UIColor.red.cgColor // Core graphic color
UIColor.red.ciColor // Core image color

注意:点击here to see How to convert SwiftUI.Color to UIColor

【讨论】:

老实说,这是最好的答案。 UIColor 上返回 suColor 的扩展非常棒。 SwiftUI 的 'Color.red' 等于 UIKit 的 'Color(.systemRed)' 或 'UIColor.systemRed' !这意味着 SwiftUI 隐含地将 systemRed 用作他的 'Color.red' 的默认值,这很高兴知道!【参考方案3】:

使用两个辅助扩展:

UIColor中提取组件:

extension UIColor 
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) 
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red, green, blue, alpha)
    

initUIColor

extension Color 
    init(uiColor: UIColor) 
        self.init(red: Double(uiColor.rgba.red),
                  green: Double(uiColor.rgba.green),
                  blue: Double(uiColor.rgba.blue),
                  opacity: Double(uiColor.rgba.alpha))
    

用法:

Color(uiColor: .red)

【讨论】:

检查getRed(_:green:blue:alpha:)的返回值很重要。它可能会失败。【参考方案4】:

在带有方便扩展的 Swift UI 自定义颜色中:

extension UIColor 
struct purple 
    static let normal = UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00)
    static let light = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)

struct gray 
    static let normal = UIColor(red:0.5, green:0.5 ,blue:0.5 , alpha:1.00)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)


并使用这个:

var body: some View 
    Text("Hello World")
    .foregroundColor(Color(UIColor.purple.normal))
    .background(Color(UIColor.gray.normal))

使用 Xcode 11.0 beta 6 编辑,代码可能会更改

【讨论】:

【参考方案5】:

我是一个非常老的爱好者。这是一种对我有用的方法。是的,我确实将全局变量用于 Constant.swift 文件中的可重用语句。此示例是内联的,因此更易于查看。我并不是说这是要走的路,它只是我的老路。

Screenshot (27k)

   import SwiftUI

    // named color from the developer's pallet
    let aluminumColor = Color(UIColor.lightGray)

    // a custom color I use often
    let butterColor = Color.init(red: 0.9993399978, 
                               green: 0.9350042167, 
                               blue: 0.5304131241)

    // how I use this in a SwiftUI VStack:

    Text("Fur People")
           .font(.title)
           .foregroundColor(aluminumColor)
           .shadow(color: butterColor, radius: 4, x: 2, y: 2)
           .minimumScaleFactor(0.75)

【讨论】:

【参考方案6】:

像这样创建一个扩展:

extension Color 
    static let someColor = Color(UIColor.systemIndigo) // << Select any UIColor

用法:

struct ContentView: View 
       var body: some View 
        Rectangle()
            .frame(width: 100, height: 100)
            .foregroundColor(.someColor)
    

【讨论】:

以上是关于如何将 UIColor 转换为 SwiftUI 的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIColor 转换为十六进制字符串?

如何使用 Swift 3 或 Hue 将 CAGradientLayer 转换为 UIColor?

如何将UIColor转换为十六进制字符串?

将 UIColor 转换为 24 位值

如何使用 c# 在 Xamarin.Ios 中将 UIColor 转换为字符串和字符串转换为 UIColor

将 NSColor 从 NSAttributedString 转换为 UIColor