前言
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIColor : NSObject@available(iOS 2.0, *) public class UIColor : NSObject, NSSecureCoding, NSCopying
- UIColor、CIColor 和 CGColor 出现在不同的类库里面,其实就是颜色存储方式不同而已,比如 999 可以用 10 进制、2 进制、16 进制等存储。三者之间都是能够方便转换的,特别是很多构造函数。
1、UIColor 的创建
Objective-C
使用系统定义好的颜色创建
UIColor *color1 = [UIColor blueColor]; // 附带设置颜色的透明度 UIColor *color1 = [[UIColor blackColor] colorWithAlphaComponent:0.5];
由白色透明度创建
// alpha:透明度,1 不透明 UIColor *color2 = [UIColor colorWithWhite:1 alpha:0.5];
由三原色创建
// arc4random()%256/255.0 获取小于等于 1 大于 0 的随机数字 CGFloat red = arc4random()%256/255.0; CGFloat green = arc4random()%256/255.0; CGFloat blue = arc4random()%256/255.0; // Red,green,blue 值的范围是 0 ~ 1,alpha:透明度,1 不透明 UIColor *color3 = [UIColor colorWithRed:red green:green blue:blue alpha:1];
由图片创建
UIColor *color4 = [UIColor colorWithPatternImage:[UIImage imageNamed:@"13"]];
由 16 进制字符串创建
NSString *colorString = @"#FF0000"; // 十六进制数字字符串转十进制数字 NSString *s1 = [colorString substringWithRange:NSMakeRange(1, 2)]; unsigned long c1 = strtoul([s1 UTF8String], 0, 16); NSString *s2 = [colorString substringWithRange:NSMakeRange(3, 2)]; unsigned long c2 = strtoul([s2 UTF8String], 0, 16); NSString *s3 = [colorString substringWithRange:NSMakeRange(5, 2)]; unsigned long c3 = strtoul([s3 UTF8String], 0, 16); // Red,green,blue 值的范围是 0 ~ 1,alpha:透明度,1 不透明 UIColor *color5 = [UIColor colorWithRed:c1/255.0 green:c2/255.0 blue:c3/255.0 alpha:1];
Swift
使用系统定义好的颜色创建
let color1:UIColor = UIColor.blueColor() // 附带设置颜色的透明度 let color1:UIColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
由白色透明度创建
// alpha:透明度,1 不透明 let color2:UIColor = UIColor(white: 1, alpha: 0.5)
由三原色创建
// arc4random()%256/255.0 获取小于等于 1 大于 0 的随机数字 let red:CGFloat = CGFloat(arc4random()%UInt32(256/255.0)) let green:CGFloat = CGFloat(arc4random()%UInt32(256/255.0)) let blue:CGFloat = CGFloat(arc4random()%UInt32(256/255.0)) // Red,green,blue 值的范围是 0 ~ 1,alpha:透明度,1 不透明 let color3:UIColor = UIColor(red: red, green: green, blue: blue, alpha: 1)
由图片创建
let color4:UIColor = UIColor(patternImage: UIImage(named: "13")!)
2、UIColor 与 CIColor 和 CGColor 的相互转换
Objective-C
// UIColor 转 CGColor CGColorRef color = [[UIColor greenColor] CGColor];
Swift
// UIColor 转 CGColor let color:CGColorRef = UIColor.greenColor().CGColor
3、由十六进制颜色值创建 RGB 颜色值
具体实现代码见 GitHub 源码
适用于 0Xc83c23、#c83c23、c83c23 格式的十六进制颜色值。
/// 由十六进制颜色值创建 RGB 颜色值,带透明度设置 + (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha { NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; // String should be 6 or 8 characters if ([cString length] < 6) { return [UIColor clearColor]; } // strip "0X" or "#" if it appears if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2]; if ([cString hasPrefix:@"#"]) cString = [cString substringFromIndex:1]; if ([cString length] != 6) return [UIColor clearColor]; // Separate into r, g, b substrings NSRange range; range.location = 0; range.length = 2; // r、g、b NSString *rString = [cString substringWithRange:range]; range.location = 2; NSString *gString = [cString substringWithRange:range]; range.location = 4; NSString *bString = [cString substringWithRange:range]; // Scan values unsigned int r, g, b; [[NSScanner scannerWithString:rString] scanHexInt:&r]; [[NSScanner scannerWithString:gString] scanHexInt:&g]; [[NSScanner scannerWithString:bString] scanHexInt:&b]; return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:alpha]; } /// 由十六进制颜色值创建 RGB 颜色值 + (UIColor *)colorWithHexString:(NSString *)color { return [UIColor colorWithHexString:color alpha:1.0f]; }
// 0X 前缀格式 UIColor *color = [UIColor colorWithHexString:@"0Xc83c23"]; UIColor *color = [UIColor colorWithHexString:@"0Xc83c23" alpha:0.5]; // # 前缀格式 UIColor *color = [UIColor colorWithHexString:@"#c83c23"]; UIColor *color = [UIColor colorWithHexString:@"#c83c23" alpha:0.5]; // 无前缀格式 UIColor *color = [UIColor colorWithHexString:@"c83c23"]; UIColor *color = [UIColor colorWithHexString:@"c83c23" alpha:0.5];