1+ //
2+ // KtColor.swift
3+ // KTColor
4+ //
5+ // Created by 张星宇 on 16/2/18.
6+ // Copyright © 2016年 zxy. All rights reserved.
7+ //
8+
9+ import Foundation
10+ import UIKit
11+
12+ // MARK: - 为字符串提供计算属性:ktcolor,根据字符串创建UIColor对象
13+ extension String {
14+ func split( seperator: Character ) -> Array < String > {
15+ return characters. split { $0 == seperator} . map { String ( $0) }
16+ }
17+
18+ func split( seperator: String ) -> Array < String > {
19+ return characters. split ( seperator. characters) . map { String ( $0) }
20+ }
21+
22+ public var ktcolor : UIColor {
23+ return ColorParser . colorFromString ( self )
24+ }
25+ }
26+
27+ extension CollectionType where Generator. Element: Equatable {
28+ func split< S: SequenceType where Generator. Element == S . Generator . Element >
29+ ( seperators: S ) -> [ SubSequence ] {
30+ return split { seperators. contains ( $0) }
31+ }
32+ }
33+
34+ /**
35+ * 负责字符串处理的内部结构体
36+ */
37+ private struct ColorParser {
38+ /**
39+ * 从16进制(字母大写)转换成十进制
40+ *
41+ * @return 十进制整数
42+ */
43+ private static func intFromHex( var hex: String ) -> Int {
44+ var sum = 0
45+ hex = hex. uppercaseString
46+ for scalar in hex. unicodeScalars {
47+ let asciiValue = Int ( scalar. value)
48+ let n : Int = asciiValue >= 65 ? asciiValue - 55 : asciiValue - 48
49+ sum = sum * 16 + n
50+ }
51+ return sum
52+ }
53+
54+ /**
55+ 将字符串数组转换为UIColor对象
56+
57+ :param: colors 数组格式为["12", "34", "56", ("1")],第四个元素如果缺失,默认为1
58+
59+ :returns: UIColor颜色对象
60+ */
61+ private static func colorFromStringImpl( colors: Array < String > ) -> UIColor {
62+ let nums = colors. flatMap { Int ( $0) }
63+ let alpha = colors. count == 4 ? CGFloat ( Double ( colors [ 3 ] ) ?? 1 ) : 1
64+ let floats = nums. map { CGFloat ( $0) }
65+
66+ return UIColor ( red: floats [ 0 ] / 255.0 , green: floats [ 1 ] / 255.0 , blue: floats [ 2 ] / 255.0 , alpha: alpha)
67+ }
68+
69+ /**
70+ 根据字符串字面量创建UIColor对象
71+
72+ :param: colorLiteral 字符串字面量,可以是十六进制数字:"#DC143C"、"#ff69b4",不区分大小写
73+ 可以是数组形式,如"111 222 223"、"111,222,223,1"、"111, 222, 223, 0.5",支持多种分隔符,默认alpha为1
74+ 可以是颜色的英文名称,如"Orchid"、"Purple"、"LightPink"、"DarkSeaGreen"等
75+ 完整列表可以参考:http://www.w3school.com.cn/cssref/css_colorsfull.asp
76+ :returns: UIColor对象,如果格式不支持,则返回默认颜色:白色
77+ */
78+ static func colorFromString( var colorLiteral: String ) -> UIColor {
79+ if let hexString = colorHexDictionary [ colorLiteral] {
80+ colorLiteral = hexString
81+ }
82+ if colorLiteral. characters. startsWith ( [ " # " ] ) {
83+ var red , green , blue : Int
84+ red = intFromHex ( String ( colorLiteral. characters. dropFirst ( ) . prefix ( 2 ) ) )
85+ green = intFromHex ( String ( colorLiteral. characters. dropFirst ( 3 ) . prefix ( 2 ) ) )
86+ blue = intFromHex ( String ( colorLiteral. characters. dropFirst ( 5 ) . prefix ( 2 ) ) )
87+ return UIColor ( red: CGFloat ( red) / 255.0 , green: CGFloat ( green) / 255.0 , blue: CGFloat ( blue) / 255.0 , alpha: 1 )
88+ }
89+ else {
90+ let numsInString1 = colorLiteral. split ( " , " )
91+ if numsInString1. count == 3 || numsInString1. count == 4 { return colorFromStringImpl ( numsInString1) }
92+
93+ let numsInString2 = colorLiteral. split ( " , " )
94+ if numsInString2. count == 3 || numsInString2. count == 4 { return colorFromStringImpl ( numsInString2) }
95+
96+ let numsInString3 = colorLiteral. split ( " " )
97+ if numsInString3. count == 3 || numsInString3. count == 4 { return colorFromStringImpl ( numsInString3) }
98+ else { return UIColor . whiteColor ( ) }
99+ }
100+ }
101+
102+ private static let colorHexDictionary : [ String : String ] = [
103+ " LightPink " : " #FFB6C1 " , " Pink " : " #FFC0CB " , " Crimson " : " #DC143C " , " LavenderBlush " : " #FFF0F5 " ,
104+ " PaleVioletRed " : " #DB7093 " , " HotPink " : " #FF69B4 " , " DeepPink " : " #FF1493 " , " MediumVioletRed " : " #C71585 " ,
105+ " Orchid " : " #DA70D6 " , " Thistle " : " #D8BFD8 " , " plum " : " #DDA0DD " , " Violet " : " #EE82EE " , " Magenta " : " #FF00FF " ,
106+ " Fuchsia " : " #FF00FF " , " DarkMagenta " : " #8B008B " , " Purple " : " #800080 " , " MediumOrchid " : " #BA55D3 " ,
107+ " DarkVoilet " : " #9400D3 " , " DarkOrchid " : " #9932CC " , " Indigo " : " #4B0082 " , " BlueViolet " : " #8A2BE2 " ,
108+ " MediumPurple " : " #9370DB " , " MediumSlateBlue " : " #7B68EE " , " SlateBlue " : " #6A5ACD " , " DarkSlateBlue " : " #483D8B " ,
109+ " Lavender " : " #E6E6FA " , " GhostWhite " : " #F8F8FF " , " Blue " : " #0000FF " , " MediumBlue " : " #0000CD " , " MidnightBlue " : " #191970 " ,
110+ " DarkBlue " : " #00008B " , " Navy " : " #000080 " , " RoyalBlue " : " #4169E1 " , " CornflowerBlue " : " #6495ED " ,
111+ " LightSteelBlue " : " #B0C4DE " , " LightSlateGray " : " #778899 " , " SlateGray " : " #708090 " , " DoderBlue " : " #1E90FF " ,
112+ " AliceBlue " : " #F0F8FF " , " SteelBlue " : " #4682B4 " , " LightSkyBlue " : " #87CEFA " , " SkyBlue " : " #87CEEB " ,
113+ " DeepSkyBlue " : " #00BFFF " , " LightBLue " : " #ADD8E6 " , " PowDerBlue " : " #B0E0E6 " , " CadetBlue " : " #5F9EA0 " , " Azure " : " #F0FFFF " ,
114+ " LightCyan " : " #E1FFFF " , " PaleTurquoise " : " #AFEEEE " , " Cyan " : " #00FFFF " , " Aqua " : " #00FFFF " , " DarkTurquoise " : " #00CED1 " ,
115+ " DarkSlateGray " : " #2F4F4F " , " DarkCyan " : " #008B8B " , " Teal " : " #008080 " , " MediumTurquoise " : " #48D1CC " ,
116+ " LightSeaGreen " : " #20B2AA " , " Turquoise " : " #40E0D0 " , " Auqamarin " : " #7FFFAA " , " MediumAquamarine " : " 00FA9A# " ,
117+ " MediumSpringGreen " : " #F5FFFA " , " MintCream " : " #00FF7F " , " SpringGreen " : " #3CB371 " , " SeaGreen " : " #2E8B57 " ,
118+ " Honeydew " : " #F0FFF0 " , " LightGreen " : " #90EE90 " , " PaleGreen " : " #98FB98 " , " DarkSeaGreen " : " #8FBC8F " , " LimeGreen " : " #32CD32 " ,
119+ " Lime " : " #00FF00 " , " ForestGreen " : " #228B22 " , " Green " : " #008000 " , " DarkGreen " : " #006400 " , " Chartreuse " : " #7FFF00 " ,
120+ " LawnGreen " : " #7CFC00 " , " GreenYellow " : " #ADFF2F " , " OliveDrab " : " #556B2F " , " Beige " : " #6B8E23 " ,
121+ " LightGoldenrodYellow " : " #FAFAD2 " , " Ivory " : " #FFFFF0 " , " LightYellow " : " #FFFFE0 " , " Yellow " : " #FFFF00 " , " Olive " : " #808000 " ,
122+ " DarkKhaki " : " #BDB76B " , " LemonChiffon " : " #FFFACD " , " PaleGodenrod " : " #EEE8AA " , " Khaki " : " #F0E68C " , " Gold " : " #FFD700 " ,
123+ " Cornislk " : " #FFF8DC " , " GoldEnrod " : " #DAA520 " , " FloralWhite " : " #FFFAF0 " , " OldLace " : " #FDF5E6 " , " Wheat " : " #F5DEB3 " ,
124+ " Moccasin " : " #FFE4B5 " , " Orange " : " #FFA500 " , " PapayaWhip " : " #FFEFD5 " , " BlanchedAlmond " : " #FFEBCD " ,
125+ " NavajoWhite " : " #FFDEAD " , " AntiqueWhite " : " #FAEBD7 " , " Tan " : " #D2B48C " , " BrulyWood " : " #DEB887 " , " Bisque " : " #FFE4C4 " ,
126+ " DarkOrange " : " #FF8C00 " , " Linen " : " #FAF0E6 " , " Peru " : " #CD853F " , " PeachPuff " : " #FFDAB9 " , " SandyBrown " : " #F4A460 " ,
127+ " Chocolate " : " #D2691E " , " SaddleBrown " : " #8B4513 " , " SeaShell " : " #FFF5EE " , " Sienna " : " #A0522D " , " LightSalmon " : " #FFA07A " ,
128+ " Coral " : " #FF7F50 " , " OrangeRed " : " #FF4500 " , " DarkSalmon " : " #E9967A " , " Tomato " : " #FF6347 " , " MistyRose " : " #FFE4E1 " ,
129+ " Salmon " : " #FA8072 " , " Snow " : " #FFFAFA " , " LightCoral " : " #F08080 " , " RosyBrown " : " #BC8F8F " , " IndianRed " : " #CD5C5C " ,
130+ " Red " : " #FF0000 " , " Brown " : " #A52A2A " , " FireBrick " : " #B22222 " , " DarkRed " : " #8B0000 " , " Maroon " : " #800000 " ,
131+ " White " : " #FFFFFF " , " WhiteSmoke " : " #F5F5F5 " , " Gainsboro " : " #DCDCDC " , " LightGrey " : " #D3D3D3 " , " Silver " : " #C0C0C0 " ,
132+ " DarkGray " : " #A9A9A9 " , " Gray " : " #808080 " , " DimGray " : " #696969 " , " Black " : " #000000 "
133+ ]
134+ }
0 commit comments