JKSwiftExtension,测试用例在 UIColorExtensionViewController.swift 里面
目录:
1、构造器设置颜色
2、使用方法设置颜色
3、UIColor的一些方法
4、UIColor 的一些属性
5、获取UIColor的HSV/HSB值(Hue色相、S饱和度、B亮度)
一、构造器设置颜色
// MARK:- 一、构造器设置颜色 public extension UIColor { // MARK: 1.1、根据 RGBA 设置颜色颜色 /// 根据 RGBA 设置颜色颜色 /// - Parameters: /// - r: red 颜色值 /// - g: green颜色值 /// - b: blue颜色值 /// - alpha: 透明度 convenience init(r: CGFloat, g: CGFloat, b: CGFloat, alpha: CGFloat = 1.0) { // 提示:在 extension 中给系统的类扩充构造函数,只能扩充:遍历构造函数 self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: alpha) } // MARK: 1.2、十六进制字符串设置颜色 /// 十六进制字符串设置颜色 /// - Parameters: /// - hex: 十六进制字符串 /// - alpha: 透明度 convenience init?(hexString: String, alpha: CGFloat = 1.0) { let color = Self.hexStringToColorRGB(hexString: hexString) guard let r = color.r, let g = color.g, let b = color.b else { #if DEBUG assert(false, "不是十六进制值") #endif return nil } self.init(r: r, g: g, b: b, alpha: alpha) } // MARK: 1.3、十六进制 Int 设置颜色 /// 十六进制 Int 设置颜色 /// - Parameters: /// - hexInt: 十六进制 Int 值 /// - alpha: 透明度 convenience init(hexInt: Int, alpha: CGFloat = 1.0) { let color = Self.hexIntToColorRGB(hexInt: hexInt) self.init(r: color.r, g: color.g, b: color.b, alpha: alpha) } }
二、使用方法设置颜色
// MARK:- 二、使用方法设置颜色 public extension UIColor { // MARK: 2.1、根据RGBA的颜色(方法) /// 根据RGBA的颜色(方法) /// - Parameters: /// - r: red 颜色值 /// - g: green颜色值 /// - b: blue颜色值 /// - alpha: 透明度 /// - Returns: 返回 UIColor static func color(r: CGFloat, g: CGFloat, b: CGFloat, alpha: CGFloat = 1.0) -> UIColor { return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: alpha) } // MARK: 2.2、十六进制字符串设置颜色(方法) static func hexStringColor(hexString: String, alpha: CGFloat = 1.0) -> UIColor { let newColor = hexStringToColorRGB(hexString: hexString) guard let r = newColor.r, let g = newColor.g, let b = newColor.b else { assert(false, "颜色值有误") return .white } return color(r: r, g: g, b: b, alpha: alpha) } // MARK: 2.3、十六进制 Int 颜色的使用(方法) /// 十六进制颜色的使用 /// - Parameters: /// - color: 16进制 Int 颜色 0x999999 /// - alpha: 透明度 /// - Returns: 返回一个 UIColor static func hexIntColor(hexInt: Int, alpha: CGFloat = 1) -> UIColor { let redComponet: Float = Float(hexInt >> 16) let greenComponent: Float = Float((hexInt & 0xFF00) >> 8) let blueComponent: Float = Float(hexInt & 0xFF) return UIColor(red: CGFloat(redComponet / 255.0), green: CGFloat(greenComponent / 255.0), blue: CGFloat(blueComponent / 255.0), alpha: alpha) } }
三、UIColor的一些方法
// MARK:- 三、UIColor的一些方法 public extension UIColor { // MARK: 3.1、根据 十六进制字符串 颜色获取 RGB,如:#3CB371 或者 ##3CB371 -> 60,179,113 /// 根据 十六进制颜色获取 RGB /// - Parameter hexString: 十六进制颜色的字符串,如:#3CB371 或者 ##3CB371 -> 60,179,113 /// - Returns: 返回 RGB static func hexStringToColorRGB(hexString: String) -> (r: CGFloat?, g: CGFloat?, b: CGFloat?) { // 1、判断字符串的长度是否符合 guard hexString.count >= 6 else { return (nil, nil, nil) } // 2、将字符串转成大写 var tempHex = hexString.uppercased() // 检查字符串是否拥有特定前缀 // hasPrefix(prefix: String) // 检查字符串是否拥有特定后缀。 // hasSuffix(suffix: String) // 3、判断开头: 0x/#/## if tempHex.hasPrefix("0x") || tempHex.hasPrefix("##") { tempHex = String(tempHex[tempHex.index(tempHex.startIndex, offsetBy: 2)..<tempHex.endIndex]) } if tempHex.hasPrefix("#") { tempHex = String(tempHex[tempHex.index(tempHex.startIndex, offsetBy: 1)..<tempHex.endIndex]) } // 4、分别取出 RGB // FF --> 255 var range = NSRange(location: 0, length: 2) let rHex = (tempHex as NSString).substring(with: range) range.location = 2 let gHex = (tempHex as NSString).substring(with: range) range.location = 4 let bHex = (tempHex as NSString).substring(with: range) // 5、将十六进制转成 255 的数字 var r: UInt32 = 0, g: UInt32 = 0, b: UInt32 = 0 Scanner(string: rHex).scanHexInt32(&r) Scanner(string: gHex).scanHexInt32(&g) Scanner(string: bHex).scanHexInt32(&b) return (r: CGFloat(r), g: CGFloat(g), b: CGFloat(b)) } // MARK: 3.2、根据 十六进制值 颜色获取 RGB, 如:0x3CB371 -> 60,179,113 /// 根据 十六进制值 颜色获取 RGB, 如:0x3CB371 -> 60,179,113 /// - Parameter hexInt: 十六进制值,如:0x3CB37 /// - Returns: 返回 RGB static func hexIntToColorRGB(hexInt: Int) -> (r: CGFloat, g: CGFloat, b: CGFloat) { let red: CGFloat = CGFloat(hexInt >> 16) let green: CGFloat = CGFloat((hexInt & 0xFF00) >> 8) let blue: CGFloat = CGFloat(hexInt & 0xFF) return (red, green, blue) } // MARK:- 3.3、color 转 RGBA /// color 转 RGBA /// - Returns: 返回对应的 RGBA func colorToRGBA() -> (r: CGFloat?, g: CGFloat?, b: CGFloat?, a: CGFloat?) { var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 let multiplier = CGFloat(255.999999) guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else { return (nil, nil, nil, nil) } return ("\(Int(red * multiplier))".toCGFloat(), "\(Int(green * multiplier))".toCGFloat(), "\(Int(blue * multiplier))".toCGFloat(), alpha) } }
四、UIColor 的一些属性
// MARK:- 四、UIColor 的一些属性 public extension UIColor { // MARK: 4.1、UIColor 转 十六进制颜色的字符串 /// UIColor 转 十六进制颜色的字符串 var hexString: String? { var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 let multiplier = CGFloat(255.999999) guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else { return nil } if alpha == 1.0 { return String( format: "#%02lX%02lX%02lX", Int(red * multiplier), Int(green * multiplier), Int(blue * multiplier) ) } else { return String( format: "#%02lX%02lX%02lX%02lX", Int(red * multiplier), Int(green * multiplier), Int(blue * multiplier), Int(alpha * multiplier) ) } } // MARK: 4.2、随机色 /// 随机色 static var randomColor: UIColor { return UIColor(r: CGFloat(arc4random()%256), g: CGFloat(arc4random()%256), b: CGFloat(arc4random()%256), alpha: 1.0) } }
五、获取UIColor的HSV/HSB值(Hue色相、S饱和度、B亮度)
/** 在平时开发中我们使用的都是 RGB 颜色模式,即通过红、绿、蓝三原色来表示一种颜色。RGB 是对机器很友好的色彩模式,但并不够人性化。 相对于 RGB,还有种 HSB(也叫 HSV)颜色模式,该模式更便于描述人眼对与颜色的感觉。使用该模式可以很明确的表达是什么颜色?鲜艳不鲜艳?亮还是暗? 1,HSB 模式介绍 HSB 又称 HSV,表示一种颜色模式。在 HSB 模式中,颜色由如下三种值组成: H(hue)代表色相:色相指色彩的种类和名称。如红、橙、黄.... 取值范围 0°~360°,每个角度可以代表一种颜色。 S(saturation)表示饱和度:它用 0% 至 100% 的值描述了相同色相、明度下色彩纯度的变化。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从灰度到纯色的变化。 B(brightness)表示亮度:其作用是控制色彩的明暗变化。它同样使用了 0% 至 100% 的取值范围。数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。 */ public extension UIColor { // MARK: 5.1、返回HSBA模式颜色值 // 返回HSBA模式颜色值 var hsba: (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) { /** hue:色相 saturation:饱和度 brightness:亮度 alpha:透明度 */ var h: CGFloat = 0 var s: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getHue(&h, saturation: &s, brightness: &b, alpha: &a) return (h * 360, s, b, a) } }