forked from soffes/sstoolkit
/
UIColor+SSToolkitAdditions.m
102 lines (79 loc) · 2.71 KB
/
UIColor+SSToolkitAdditions.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//
// UIColor+SSToolkitAdditions.m
// SSToolkit
//
// Created by Sam Soffes on 4/19/10.
// Copyright 2010-2011 Sam Soffes. All rights reserved.
//
#import "UIColor+SSToolkitAdditions.h"
static NSUInteger integerFromHexString(NSString *string) {
NSUInteger result = 0;
sscanf([string UTF8String], "%x", &result);
return result;
}
@implementation UIColor (SSToolkitAdditions)
// Adapted from https://github.com/Cocoanetics/NSAttributedString-Additions-for-HTML
+ (UIColor *)colorWithHex:(NSString *)hex {
// Remove `#`
if ([[hex substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"#"]) {
hex = [hex substringFromIndex:1];
}
// Invalid if not 3, or 6 characters
NSUInteger length = [hex length];
if (length != 3 && length != 6) {
return nil;
}
NSUInteger digits = length / 3;
CGFloat maxValue = (digits == 1) ? 15.0f : 255.0f;
CGFloat red = integerFromHexString([hex substringWithRange:NSMakeRange(0, digits)]) / maxValue;
CGFloat green = integerFromHexString([hex substringWithRange:NSMakeRange(digits, digits)]) / maxValue;
CGFloat blue = integerFromHexString([hex substringWithRange:NSMakeRange(2 * digits, digits)]) / maxValue;
return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];
}
// Inspired by https://github.com/Cocoanetics/NSAttributedString-Additions-for-HTML
- (NSString *)hexValue {
CGColorRef color = self.CGColor;
size_t count = CGColorGetNumberOfComponents(color);
const CGFloat *components = CGColorGetComponents(color);
static NSString *stringFormat = @"%02x%02x%02x";
// Grayscale
if (count == 2) {
NSUInteger white = (NSUInteger)(components[0] * (CGFloat)255);
return [NSString stringWithFormat:stringFormat, white, white, white];
}
// RGB
else if (count == 4) {
return [NSString stringWithFormat:stringFormat, (NSUInteger)(components[0] * (CGFloat)255),
(NSUInteger)(components[1] * (CGFloat)255), (NSUInteger)(components[2] * (CGFloat)255)];
}
// Unsupported color space
return nil;
}
- (CGFloat)red {
CGColorRef color = self.CGColor;
if (CGColorSpaceGetModel(CGColorGetColorSpace(color)) != kCGColorSpaceModelRGB) {
return -1.0f;
}
CGFloat const *components = CGColorGetComponents(color);
return components[0];
}
- (CGFloat)green {
CGColorRef color = self.CGColor;
if (CGColorSpaceGetModel(CGColorGetColorSpace(color)) != kCGColorSpaceModelRGB) {
return -1.0f;
}
CGFloat const *components = CGColorGetComponents(color);
return components[1];
}
- (CGFloat)blue {
CGColorRef color = self.CGColor;
if (CGColorSpaceGetModel(CGColorGetColorSpace(color)) != kCGColorSpaceModelRGB) {
return -1.0f;
}
CGFloat const *components = CGColorGetComponents(color);
return components[2];
}
- (CGFloat)alpha {
return CGColorGetAlpha(self.CGColor);
}
@end