How can I create a UIColor from a hex string?

后端 未结 30 1613
北恋
北恋 2020-11-22 16:53

How can I create a UIColor from a hexadecimal string format, such as #00FF00?

30条回答
  •  借酒劲吻你
    2020-11-22 17:15

    There's a nice post on how to tackle the OP's question of extracting a UIColor from a hex string. The solution presented below is different from others because it supports string values that may include '0x' or '#' prefixed to the hex string representation... (see usage)

    Here's the main bit...

    - (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
    {
      // Convert hex string to an integer
      unsigned int hexint = [self intFromHexString:hexStr];
    
      // Create a color object, specifying alpha as well
      UIColor *color =
        [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255
        green:((CGFloat) ((hexint & 0xFF00) >> 8))/255
        blue:((CGFloat) (hexint & 0xFF))/255
        alpha:alpha];
    
      return color;
    }
    

    Helper method...

    - (unsigned int)intFromHexString:(NSString *)hexStr
    {
      unsigned int hexInt = 0;
    
      // Create scanner
      NSScanner *scanner = [NSScanner scannerWithString:hexStr];
    
      // Tell scanner to skip the # character
      [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];
    
      // Scan hex value
      [scanner scanHexInt:&hexInt];
    
      return hexInt;
    }
    

    Usage:

    NSString *hexStr1 = @"123ABC";
    NSString *hexStr2 = @"#123ABC";
    NSString *hexStr3 = @"0x123ABC";
    
    UIColor *color1 = [self getUIColorObjectFromHexString:hexStr1 alpha:.9];
    NSLog(@"UIColor: %@", color1);
    
    UIColor *color2 = [self getUIColorObjectFromHexString:hexStr2 alpha:.9];
    NSLog(@"UIColor: %@", color2);
    
    UIColor *color3 = [self getUIColorObjectFromHexString:hexStr3 alpha:.9];
    NSLog(@"UIColor: %@", color3);
    

    Complete Reference Article

    Swift 2+

    I've ported this solution to Swift 2.2. Note that I've changed the alpha parameter to use a default set to 1.0. I've also updated the int type to UInt32 as required by the NSScanner class in Swift 2.2.

    func colorWithHexString(hexString: String, alpha:CGFloat = 1.0) -> UIColor {
    
        // Convert hex string to an integer
        let hexint = Int(self.intFromHexString(hexString))
        let red = CGFloat((hexint & 0xff0000) >> 16) / 255.0
        let green = CGFloat((hexint & 0xff00) >> 8) / 255.0
        let blue = CGFloat((hexint & 0xff) >> 0) / 255.0 
    
        // Create color object, specifying alpha as well
        let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
        return color
    }
    
    func intFromHexString(hexStr: String) -> UInt32 {
        var hexInt: UInt32 = 0
        // Create scanner
        let scanner: NSScanner = NSScanner(string: hexStr)
        // Tell scanner to skip the # character
        scanner.charactersToBeSkipped = NSCharacterSet(charactersInString: "#")
        // Scan hex value
        scanner.scanHexInt(&hexInt)
        return hexInt
    }
    

    Swift 4+

    Using the same logic with changes applied for swift 4,

    func colorWithHexString(hexString: String, alpha:CGFloat = 1.0) -> UIColor {
    
        // Convert hex string to an integer
        let hexint = Int(self.intFromHexString(hexStr: hexString))
        let red = CGFloat((hexint & 0xff0000) >> 16) / 255.0
        let green = CGFloat((hexint & 0xff00) >> 8) / 255.0
        let blue = CGFloat((hexint & 0xff) >> 0) / 255.0
    
        // Create color object, specifying alpha as well
        let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
        return color
    }
    
    func intFromHexString(hexStr: String) -> UInt32 {
        var hexInt: UInt32 = 0
        // Create scanner
        let scanner: Scanner = Scanner(string: hexStr)
        // Tell scanner to skip the # character
        scanner.charactersToBeSkipped = CharacterSet(charactersIn: "#")
        // Scan hex value
        scanner.scanHexInt32(&hexInt)
        return hexInt
    }
    

    Color Hex References

    HTML Color Names and Codes

    Color Hex Color Codes

提交回复
热议问题