[Swift5][工具方法]将字符串RBG(类似0x000000)转成UIColor

2021-01-24 49点热度 0人点赞 0条评论

在做开发的时候,企划给的企划案里的颜色,可能是类似0x000000这样的字符串,或者我们根据屏幕颜色做拾取的时候,也是得到类似这样的字符串,但是我们在代码里生成UIColor的时候,就没有那么简单的方法,直接从0xFFFFFF这样构造出UIColor,UIColor的构造方法,需要RBGA4个参数,对我们程序员来说转换相对麻烦一点,并且后面再看看代码的时候,光从 rbg 的数值,也不能一眼看出来是什么:

UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)

下面分享我自用的 Extension,让 UIColor 的构造方法可以接收字符串类型,支持0xRGB或者0xARGB,就是带透明度 aplha 通道
import UIKit

extension UIColor {
    convenience init?(rgba: String) {
        var r: CGFloat = 0.0
        var g: CGFloat = 0.0
        var b: CGFloat = 0.0
        var a: CGFloat = 1.0

        if rgba.hasPrefix("#") {
            let fromIndex = rgba.index(rgba.startIndex, offsetBy: 1)
            let hexColor = String(rgba[fromIndex...])

            let scanner = Scanner(string: hexColor)
            var hexNumber: CUnsignedLongLong = 0

            if scanner.scanHexInt64(&hexNumber) {
                if hexColor.count == 6 {
                    r = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255.0
                    g = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255.0
                    b = CGFloat(hexNumber & 0x000000ff) / 255.0
                } else if(hexColor.count == 8) {
                    a = CGFloat((hexNumber & 0xFF000000) >> 24) / 255.0
                    r = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255.0
                    g = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255.0
                    b = CGFloat(hexNumber & 0x000000FF) / 255.0
                }

                self.init(red: r, green: g, blue: b, alpha: a)
                return
            }
        }

        return nil
    }
}
使用方法
//带 alpha 通道的
var color = UIColor(rgba: "#88663D45")
//不带 alpha 通道的
color = UIColor(rgba: "#663D45")

另外如果你肯定用不到 alpha通道,可以更加简单一些,我写了个示例方法(传入 rgb 的 Int 值,传出非可选的 UIColor),也可以自行改造成 Extension,如下:

func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

//如何使用:
let color = UIColorFromRGB(0x663D45)

 

 

Terry

记录开发运维过程中遇到的坑以及解决方案,干货分享

文章评论

*

code