我该如何从十六进制字符串格式(例如#00FF00
)创建一个UIColor
呢?
我该如何从十六进制字符串格式(例如#00FF00
)创建一个UIColor
呢?
Swift版本:
extension UIColor {
convenience init?(var hex: String) {
hex = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString
hex = (hex.hasPrefix("#")) ? hex.substringFromIndex(advance(hex.startIndex, 1)) : hex
var value: UInt32 = 0
if NSScanner(string: hex).scanHexInt(&value) {
if count(hex) == 8 {
self.init(red: CGFloat((value & 0xFF000000) >> 24) / 255.0,
green: CGFloat((value & 0x00FF0000) >> 16) / 255.0,
blue: CGFloat((value & 0x0000FF00) >> 8) / 255.0,
alpha: CGFloat((value & 0x000000FF)) / 255.0)
return
} else if count(hex) == 6 {
self.init(red: CGFloat((value & 0xFF0000) >> 16) / 255.0,
green: CGFloat((value & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(value & 0x0000FF) / 255.0,
alpha: 1.0)
return
}
}
self.init()
return nil
}
}
https://github.com/burhanuddin353/TFTColor
Swift
UIColor.colorWithRGB(hexString: "FF34AE" alpha: 1.0)
Objective-C
[UIColor colorWithRGBHexString:@"FF34AE" alpha:1.0f]
Swift 3 示例 Ethan Strider的答案。一个接受十六进制字符串并返回UIColor的函数。
(您可以使用以下任何格式输入十六进制字符串:#ffffff
或ffffff
)
示例:
func hexStringToUIColor (hex:String) -> UIColor {
var cString: String = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased()
if (cString.hasPrefix("#")) {
if let range = cString.range(of: cString) {
cString = cString.substring(from: cString.index(range.lowerBound, offsetBy: 1))
}
}
if ((cString.characters.count) != 6) {
return UIColor.gray
}
var rgbValue: UInt32 = 0
Scanner(string: cString).scanHexInt32(&rgbValue)
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
使用方法:
var color1 = hexStringToUIColor("#d3d3d3")
优化自@Tom的原始答案,随意在这里更新代码。
extension UIColor{
convenience init (hexString:String) {
var cleanString:String = hexString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString
if (cleanString.hasPrefix("#")) {
cleanString = cleanString.substringFromIndex(cleanString.startIndex.advancedBy(1))
}
if (cleanString.characters.count != 6) {
self.init()
}
else{
var rgbValue = UInt32()
let scanner = NSScanner(string: cleanString)
scanner.scanHexInt(&rgbValue)
self.init(
red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0,
green: CGFloat((rgbValue & 0xFF00) >> 8)/255.0,
blue: CGFloat(rgbValue & 0xFF)/255.0,
alpha: 1.0)
}
}
}
extension UIColor {
convenience init(R: CGFloat, G: CGFloat, B: CGFloat, alpha: CGFloat) {
self.init(red: R/255.0, green: G/255.0, blue: B/255.0, alpha: alpha)
}
class func colorWithHex(hex: UInt, alpha: CGFloat) -> UIColor {
return UIColor(R: CGFloat((hex & 0xFF0000) >> 16), G: CGFloat((hex & 0x00FF00) >> 8), B: CGFloat(hex & 0x0000FF), alpha: alpha)
}
}
几种解决方案中涉及了一些不必要使用的NSString。这个UIColor类的扩展更简单、更快:
+ colorWithHex:(UInt32)hex alpha:(CGFloat)alpha
{
return [UIColor colorWithRed:((hex & 0xFF0000) >> 16)/255.0
green:((hex & 0x00FF00) >> 8)/255.0
blue:( hex & 0x0000FF)/255.0
alpha:alpha];
}
并且只需简单地使用它:
return [UIColor colorWithHex:0x006400 alpha:1.0]; // HTML darkgreen
大多数答案使用 Scanner
、位掩码或子字符串操作。
还可以使用 chunks(ofCount:)
和 UInt8.init(_:radix:)
提取颜色组件:
import Foundation
import XCTest
import Algorithms
class UIColorFromStringTests: XCTestCase {
func testUIColorFromString() throws {
let color = "00FF00"
let components = color
.chunks(ofCount: 2)
.compactMap { UInt8($0, radix: 16) }
XCTAssertEqual(components, [0x00, 0xFF, 0x00])
let red = CGFloat(components[0]) / 255 // 0
let green = CGFloat(components[1]) / 255 // 1
let blue = CGFloat(components[2]) / 255 // 0
_ = UIColor(red: red, green: green, blue: blue, alpha: 1)
}
}
这里有一个很好的UIColor类别,其中包含许多功能。
用法:
textView.textColor = [UIColor colorWithHexString:textColorHex];
NSLog(@"Text Color Hex: %@", textColorHex);
textColorHex的格式为@"FFFFFF",不带#符号。
Color Literal
,然后让Xcode自动完成其余部分。#FF9300
。
宏的 git diff 将显示 RGB 值而不是十六进制:
let orange = #colorLiteral(red: 1, green: 0.5763723254, blue: 0, alpha: 1)
但这仍然是一种简单的方法,可以在没有任何第三方工具或扩展的情况下粘贴十六进制。