How to convert UIColor to string and string in UIColor using swift?

I have an object with the UIColor property:

class Beer: NSObject { var color: UIColor? ... } 

I save this in the database, so I need to make this property a valid JSON type, so I'm going to convert it to a string. How to convert to a string for storage, and then create a UIColor when loading with this string?

+5
source share
7 answers

I put some sample for both conversions, but you can find a lot of code for the transform

To convert from UIColor to a hexadecimal string, you can use the following code:

 extension UIColor { var rgbComponents:(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { var r:CGFloat = 0 var g:CGFloat = 0 var b:CGFloat = 0 var a:CGFloat = 0 if getRed(&r, green: &g, blue: &b, alpha: &a) { return (r,g,b,a) } return (0,0,0,0) } // hue, saturation, brightness and alpha components from UIColor** var hsbComponents:(hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) { var hue:CGFloat = 0 var saturation:CGFloat = 0 var brightness:CGFloat = 0 var alpha:CGFloat = 0 if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha){ return (hue,saturation,brightness,alpha) } return (0,0,0,0) } var htmlRGBColor:String { return String(format: "#%02x%02x%02x", Int(rgbComponents.red * 255), Int(rgbComponents.green * 255),Int(rgbComponents.blue * 255)) } var htmlRGBaColor:String { return String(format: "#%02x%02x%02x%02x", Int(rgbComponents.red * 255), Int(rgbComponents.green * 255),Int(rgbComponents.blue * 255),Int(rgbComponents.alpha * 255) ) } } 

Using an example:

 let myColorBlack = UIColor.blackColor().webColor //#000000ff let myLghtGrayColor = UIColor.lightGrayColor().webColor //#aaaaaaff let myDarkGrayColor = UIColor.darkGrayColor().webColor 

For more information you can check: fooobar.com/questions/36961 / ...
https://gist.github.com/yannickl/16f0ed38f0698d9a8ae7

You can save this line inside db and get it when you need it

From HexString to UIColor

 extension UIColor { public convenience init?(hexString: String) { let r, g, b, a: CGFloat if hexString.hasPrefix("#") { let start = hexString.startIndex.advancedBy(1) let hexColor = hexString.substringFromIndex(start) if hexColor.characters.count == 8 { let scanner = NSScanner(string: hexColor) var hexNumber: UInt64 = 0 if scanner.scanHexLongLong(&hexNumber) { r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000ff) / 255 self.init(red: r, green: g, blue: b, alpha: a) return } } } return nil } } 

Usage: UIColor (hexString: "# ffe700ff")

Link: https://www.hackingwithswift.com/example-code/uicolor/how-to-convert-a-hex-color-to-a-uicolor
https://github.com/yeahdongcn/UIColor-Hex-Swift
https://gist.github.com/arshad/de147c42d7b3063ef7bc

+10
source

You can use this function

 func returnUIColor(components: String) -> UIColor { let scanner = Scanner(string: components) let skipped = CharacterSet(charactersIn: "[], ") let comma = CharacterSet(charactersIn: ",") scanner.charactersToBeSkipped = skipped var r, g, b, a : NSString? scanner.scanUpToCharacters(from: comma, into: &r) scanner.scanUpToCharacters(from: comma, into: &g) scanner.scanUpToCharacters(from: comma, into: &b) scanner.scanUpToCharacters(from: comma, into: &a) let defaultColor = UIColor.lightGray guard let rUnwrapped = r else { return defaultColor } guard let gUnwrapped = g else { return defaultColor } guard let bUnwrapped = b else { return defaultColor } guard let aUnwrapped = a else { return defaultColor } let rfloat = CGFloat(rUnwrapped.doubleValue) let gfloat = CGFloat(gUnwrapped.doubleValue) let bfloat = CGFloat(bUnwrapped.doubleValue) let afloat = CGFloat(aUnwrapped.doubleValue) let newUIColor = UIColor(red: rfloat, green: gfloat, blue: bfloat, alpha: afloat) return newUIColor } 
+1
source

Swift 3.0 iOS 10.x I don’t understand why it is so complicated, it works ... I must have missed something ... read it carefully, start from point 1, not 0.

  // convert color to string let color = userInfo["color"] as! UIColor let diyColor = String(describing: color) // convert string back to color let diyValues = diyColor.components(separatedBy: " ") print("diyValues \(diyValues)") let returnedColor = UIColor(colorLiteralRed: diyValues[1].FloatValue()!, green: diyValues[2].FloatValue()!, blue: diyValues[3].FloatValue()!, alpha: diyValues[4].FloatValue()!) 

With this extension ...

 extension String { func FloatValue() -> Float? { guard let doubleValue = Double(self) else { return nil } return Float(doubleValue) } } 
0
source

Use the UIColor extension below to convert String to Color and vice versa.

 extension UIColor { //Convert RGBA String to UIColor object //"rgbaString" must be separated by space "0.5 0.6 0.7 1.0" 50% of Red 60% of Green 70% of Blue Alpha 100% public convenience init?(rgbaString : String){ self.init(ciColor: CIColor(string: rgbaString)) } //Convert UIColor to RGBA String func toRGBAString()-> String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) return "\(r) \(g) \(b) \(a)" } //return UIColor from Hexadecimal Color string public convenience init?(hexaDecimalString: String) { let r, g, b, a: CGFloat if hexaDecimalString.hasPrefix("#") { let start = hexaDecimalString.index(hexaDecimalString.startIndex, offsetBy: 1) let hexColor = hexaDecimalString.substring(from: start) if hexColor.characters.count == 8 { let scanner = Scanner(string: hexColor) var hexNumber: UInt64 = 0 if scanner.scanHexInt64(&hexNumber) { r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000ff) / 255 self.init(red: r, green: g, blue: b, alpha: a) return } } } return nil } // Convert UIColor to Hexadecimal String func toHexString() -> String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) return String( format: "%02X%02X%02X", Int(r * 0xff), Int(g * 0xff), Int(b * 0xff) ) } 

}

Save this color string ( stringWhite ) in a DataBase

 let stringWhite = UIColor.white.toHexString() 

when reading a color string from a database, use the code below to convert stringWhite to UIColor

 let whiteColor = UIColor(hexaDecimalString: stringWhite) 
0
source

I am adding my own extension, I hope you appreciate:

 extension UIColor { func toRGBAString(uppercased: Bool = true) -> String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) let rgba = [r, g, b, a].map { $0 * 255 }.reduce("", { $0 + String(format: "%02x", Int($1)) }) return uppercased ? rgba.uppercased() : rgba } } 
0
source

Inspired by @HardikDG code, these are simple Objective-C functions:

 - (NSString *) colorToString:(UIColor *) color { CGFloat red, green, blue, alpha; [color getRed:&red green:&green blue:&blue alpha:&alpha]; return [NSString stringWithFormat:@"%02x%02x%02x", (int)(red * 255), (int)(green * 255) , (int)(blue * 255)]; } - (UIColor *) stringToColor:(NSString *) color { if([color length] != 6) { return nil; } NSScanner *scanner = [NSScanner scannerWithString:color]; UInt64 hexNumber = 0; if ([scanner scanHexLongLong:&hexNumber]) { CGFloat r = ((hexNumber & 0xff000000) >> 24) / 255.0; CGFloat g = ((hexNumber & 0x00ff0000) >> 16) / 255.0; CGFloat b = ((hexNumber & 0x0000ff00) >> 8) / 255.0; CGFloat a = (hexNumber & 0x000000ff) / 255.0; return [UIColor colorWithRed:r green:g blue:b alpha:a]; } return [UIColor whiteColor]; } 
0
source

A bit shorter using NSCoding:

in line:

colorString = String (data: NSKeyedArchiver.archivedDataWithRootObject (color), encoding: .utf8)

from line:

color = NSKeyedUnarchiver.unarchiveObjectWithData (colorString.dataUsingEncoding (.utf8))

0
source

Source: https://habr.com/ru/post/1246181/


All Articles