Last active
September 27, 2019 09:32
-
-
Save Huang-Libo/c63c5267e2d50d79e115b5153ac3d75f to your computer and use it in GitHub Desktop.
Objective-C 中的颜色工具
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 参考 WeexSDK `WXConvert.m` 中的 `+UIColor:` 方法 (且在其基础上添加了对 #rrggbbaa 格式的支持) | |
/// @param colorString 颜色字符串, 支持以下格式: | |
/// #fff | |
/// #rrggbb | |
/// #rrggbbaa | |
/// rgb(r,g,b) | |
/// rgba(r,g,b,a) | |
+ (UIColor *)colorWithColorString:(NSString *)colorString { | |
// 1. check cache | |
static NSCache *colorCache; | |
static dispatch_once_t onceToken; | |
dispatch_once(&onceToken, ^{ | |
colorCache = [[NSCache alloc] init]; | |
colorCache.countLimit = 64; | |
}); | |
if ([colorString isKindOfClass:[NSNull class]] || !colorString) { | |
return nil; | |
} | |
UIColor *color = [colorCache objectForKey:colorString]; | |
if (color) { | |
return color; | |
} | |
// Default color is white | |
double red = 255, green = 255, blue = 255, alpha = 1.0; | |
if([colorString isKindOfClass:[NSString class]]){ | |
/* `WXConvert.m` 中的 knownColors 相关功能用不上, 已删除*/ | |
NSString *rgba = colorString; | |
if ([rgba hasPrefix:@"#"]) { | |
// #fff | |
if ([rgba length] == 4) { | |
unichar f = [rgba characterAtIndex:1]; | |
unichar s = [rgba characterAtIndex:2]; | |
unichar t = [rgba characterAtIndex:3]; | |
rgba = [NSString stringWithFormat:@"#%C%C%C%C%C%C", f, f, s, s, t, t]; | |
} | |
uint32_t colorValue = 0; | |
sscanf(rgba.UTF8String, "#%x", &colorValue); | |
if ([rgba length] == 7) { | |
// #rrggbb | |
red = ((colorValue & 0xFF0000) >> 16) / 255.0; | |
green = ((colorValue & 0x00FF00) >> 8) / 255.0; | |
blue = (colorValue & 0x0000FF) / 255.0; | |
} else if ([rgba length] == 9) { | |
// #rrggbbaa | |
red = ((colorValue & 0xFF000000) >> 24) / 255.0; | |
green = ((colorValue & 0x00FF0000) >> 16) / 255.0; | |
blue = ((colorValue & 0x0000FF00) >> 8) / 255.0; | |
alpha = (colorValue & 0x000000FF) / 255.0; | |
} | |
} else if ([rgba hasPrefix:@"rgb("]) { | |
// rgb(r,g,b) | |
int r,g,b; | |
sscanf(rgba.UTF8String, "rgb(%d,%d,%d)", &r, &g, &b); | |
red = r / 255.0; | |
green = g / 255.0; | |
blue = b / 255.0; | |
} else if ([rgba hasPrefix:@"rgba("]) { | |
// rgba(r,g,b,a) | |
int r,g,b; | |
sscanf(rgba.UTF8String, "rgba(%d,%d,%d,%lf)", &r, &g, &b, &alpha); | |
red = r / 255.0; | |
green = g / 255.0; | |
blue = b / 255.0; | |
} | |
} | |
color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; | |
// 6. cache color | |
if (color && colorString) { | |
[colorCache setObject:color forKey:colorString]; | |
} | |
return color; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// WeexSDK `WXConvert.m` 中的 `+UIColor:` 方法 | |
+ (UIColor *)UIColor:(id)value | |
{ | |
// 1. check cache | |
static NSCache *colorCache; | |
static dispatch_once_t onceToken; | |
dispatch_once(&onceToken, ^{ | |
colorCache = [[NSCache alloc] init]; | |
colorCache.countLimit = 64; | |
}); | |
if ([value isKindOfClass:[NSNull class]] || !value) { | |
return nil; | |
} | |
UIColor *color = [colorCache objectForKey:value]; | |
if (color) { | |
return color; | |
} | |
// Default color is white | |
double red = 255, green = 255, blue = 255, alpha = 1.0; | |
if([value isKindOfClass:[NSString class]]){ | |
// 2. check if is color keyword or transparent | |
static NSDictionary *knownColors; | |
static dispatch_once_t onceTokenKnownColors; | |
dispatch_once(&onceTokenKnownColors, ^{ | |
knownColors = @{ | |
// https://www.w3.org/TR/css3-color/#svg-color | |
@"aliceblue": @"#f0f8ff", | |
@"antiquewhite": @"#faebd7", | |
@"aqua": @"#00ffff", | |
@"aquamarine": @"#7fffd4", | |
@"azure": @"#f0ffff", | |
@"beige": @"#f5f5dc", | |
@"bisque": @"#ffe4c4", | |
@"black": @"#000000", | |
@"blanchedalmond": @"#ffebcd", | |
@"blue": @"#0000ff", | |
@"blueviolet": @"#8a2be2", | |
@"brown": @"#a52a2a", | |
@"burlywood": @"#deb887", | |
@"cadetblue": @"#5f9ea0", | |
@"chartreuse": @"#7fff00", | |
@"chocolate": @"#d2691e", | |
@"coral": @"#ff7f50", | |
@"cornflowerblue": @"#6495ed", | |
@"cornsilk": @"#fff8dc", | |
@"crimson": @"#dc143c", | |
@"cyan": @"#00ffff", | |
@"darkblue": @"#00008b", | |
@"darkcyan": @"#008b8b", | |
@"darkgoldenrod": @"#b8860b", | |
@"darkgray": @"#a9a9a9", | |
@"darkgrey": @"#a9a9a9", | |
@"darkgreen": @"#006400", | |
@"darkkhaki": @"#bdb76b", | |
@"darkmagenta": @"#8b008b", | |
@"darkolivegreen": @"#556b2f", | |
@"darkorange": @"#ff8c00", | |
@"darkorchid": @"#9932cc", | |
@"darkred": @"#8b0000", | |
@"darksalmon": @"#e9967a", | |
@"darkseagreen": @"#8fbc8f", | |
@"darkslateblue": @"#483d8b", | |
@"darkslategray": @"#2f4f4f", | |
@"darkslategrey": @"#2f4f4f", | |
@"darkturquoise": @"#00ced1", | |
@"darkviolet": @"#9400d3", | |
@"deeppink": @"#ff1493", | |
@"deepskyblue": @"#00bfff", | |
@"dimgray": @"#696969", | |
@"dimgrey": @"#696969", | |
@"dodgerblue": @"#1e90ff", | |
@"firebrick": @"#b22222", | |
@"floralwhite": @"#fffaf0", | |
@"forestgreen": @"#228b22", | |
@"fuchsia": @"#ff00ff", | |
@"gainsboro": @"#dcdcdc", | |
@"ghostwhite": @"#f8f8ff", | |
@"gold": @"#ffd700", | |
@"goldenrod": @"#daa520", | |
@"gray": @"#808080", | |
@"grey": @"#808080", | |
@"green": @"#008000", | |
@"greenyellow": @"#adff2f", | |
@"honeydew": @"#f0fff0", | |
@"hotpink": @"#ff69b4", | |
@"indianred": @"#cd5c5c", | |
@"indigo": @"#4b0082", | |
@"ivory": @"#fffff0", | |
@"khaki": @"#f0e68c", | |
@"lavender": @"#e6e6fa", | |
@"lavenderblush": @"#fff0f5", | |
@"lawngreen": @"#7cfc00", | |
@"lemonchiffon": @"#fffacd", | |
@"lightblue": @"#add8e6", | |
@"lightcoral": @"#f08080", | |
@"lightcyan": @"#e0ffff", | |
@"lightgoldenrodyellow": @"#fafad2", | |
@"lightgray": @"#d3d3d3", | |
@"lightgrey": @"#d3d3d3", | |
@"lightgreen": @"#90ee90", | |
@"lightpink": @"#ffb6c1", | |
@"lightsalmon": @"#ffa07a", | |
@"lightseagreen": @"#20b2aa", | |
@"lightskyblue": @"#87cefa", | |
@"lightslategray": @"#778899", | |
@"lightslategrey": @"#778899", | |
@"lightsteelblue": @"#b0c4de", | |
@"lightyellow": @"#ffffe0", | |
@"lime": @"#00ff00", | |
@"limegreen": @"#32cd32", | |
@"linen": @"#faf0e6", | |
@"magenta": @"#ff00ff", | |
@"maroon": @"#800000", | |
@"mediumaquamarine": @"#66cdaa", | |
@"mediumblue": @"#0000cd", | |
@"mediumorchid": @"#ba55d3", | |
@"mediumpurple": @"#9370db", | |
@"mediumseagreen": @"#3cb371", | |
@"mediumslateblue": @"#7b68ee", | |
@"mediumspringgreen": @"#00fa9a", | |
@"mediumturquoise": @"#48d1cc", | |
@"mediumvioletred": @"#c71585", | |
@"midnightblue": @"#191970", | |
@"mintcream": @"#f5fffa", | |
@"mistyrose": @"#ffe4e1", | |
@"moccasin": @"#ffe4b5", | |
@"navajowhite": @"#ffdead", | |
@"navy": @"#000080", | |
@"oldlace": @"#fdf5e6", | |
@"olive": @"#808000", | |
@"olivedrab": @"#6b8e23", | |
@"orange": @"#ffa500", | |
@"orangered": @"#ff4500", | |
@"orchid": @"#da70d6", | |
@"palegoldenrod": @"#eee8aa", | |
@"palegreen": @"#98fb98", | |
@"paleturquoise": @"#afeeee", | |
@"palevioletred": @"#db7093", | |
@"papayawhip": @"#ffefd5", | |
@"peachpuff": @"#ffdab9", | |
@"peru": @"#cd853f", | |
@"pink": @"#ffc0cb", | |
@"plum": @"#dda0dd", | |
@"powderblue": @"#b0e0e6", | |
@"purple": @"#800080", | |
@"rebeccapurple": @"#663399", | |
@"red": @"#ff0000", | |
@"rosybrown": @"#bc8f8f", | |
@"royalblue": @"#4169e1", | |
@"saddlebrown": @"#8b4513", | |
@"salmon": @"#fa8072", | |
@"sandybrown": @"#f4a460", | |
@"seagreen": @"#2e8b57", | |
@"seashell": @"#fff5ee", | |
@"sienna": @"#a0522d", | |
@"silver": @"#c0c0c0", | |
@"skyblue": @"#87ceeb", | |
@"slateblue": @"#6a5acd", | |
@"slategray": @"#708090", | |
@"slategrey": @"#708090", | |
@"snow": @"#fffafa", | |
@"springgreen": @"#00ff7f", | |
@"steelblue": @"#4682b4", | |
@"tan": @"#d2b48c", | |
@"teal": @"#008080", | |
@"thistle": @"#d8bfd8", | |
@"tomato": @"#ff6347", | |
@"turquoise": @"#40e0d0", | |
@"violet": @"#ee82ee", | |
@"wheat": @"#f5deb3", | |
@"white": @"#ffffff", | |
@"whitesmoke": @"#f5f5f5", | |
@"yellow": @"#ffff00", | |
@"yellowgreen": @"#9acd32", | |
// https://www.w3.org/TR/css3-color/#transparent | |
@"transparent": @"rgba(0,0,0,0)", | |
}; | |
}); | |
NSString *rgba = knownColors[value]; | |
if (!rgba) { | |
rgba = value; | |
} | |
if ([rgba hasPrefix:@"#"]) { | |
// #fff | |
if ([rgba length] == 4) { | |
unichar f = [rgba characterAtIndex:1]; | |
unichar s = [rgba characterAtIndex:2]; | |
unichar t = [rgba characterAtIndex:3]; | |
rgba = [NSString stringWithFormat:@"#%C%C%C%C%C%C", f, f, s, s, t, t]; | |
} | |
// 3. #rrggbb | |
uint32_t colorValue = 0; | |
sscanf(rgba.UTF8String, "#%x", &colorValue); | |
red = ((colorValue & 0xFF0000) >> 16) / 255.0; | |
green = ((colorValue & 0x00FF00) >> 8) / 255.0; | |
blue = (colorValue & 0x0000FF) / 255.0; | |
} else if ([rgba hasPrefix:@"rgb("]) { | |
// 4. rgb(r,g,b) | |
int r,g,b; | |
sscanf(rgba.UTF8String, "rgb(%d,%d,%d)", &r, &g, &b); | |
red = r / 255.0; | |
green = g / 255.0; | |
blue = b / 255.0; | |
} else if ([rgba hasPrefix:@"rgba("]) { | |
// 5. rgba(r,g,b,a) | |
int r,g,b; | |
sscanf(rgba.UTF8String, "rgba(%d,%d,%d,%lf)", &r, &g, &b, &alpha); | |
red = r / 255.0; | |
green = g / 255.0; | |
blue = b / 255.0; | |
} | |
} else if([value isKindOfClass:[NSNumber class]]) { | |
NSUInteger colorValue = [value unsignedIntegerValue]; | |
red = ((colorValue & 0xFF0000) >> 16) / 255.0; | |
green = ((colorValue & 0x00FF00) >> 8) / 255.0; | |
blue = (colorValue & 0x0000FF) / 255.0; | |
} | |
color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; | |
// 6. cache color | |
if (color && value) { | |
[colorCache setObject:color forKey:value]; | |
} | |
return color; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment