30

I want to make a conversion from hexadecimal to RGB, but the hexadecimal deal with a string like #FFFFFF. How can I do that?

vikingosegundo
  • 52,040
  • 14
  • 137
  • 178
R. Dewi
  • 4,141
  • 9
  • 41
  • 66

4 Answers4

87

I've just expanded my UIColor Category for you.
use it like UIColor *green = [UIColor colorWithHexString:@"#00FF00"];

//
//  UIColor_Categories.h
//
//  Created by Matthias Bauch on 24.11.10.
//  Copyright 2010 Matthias Bauch. All rights reserved.
//

#import <Foundation/Foundation.h>


@interface UIColor(MBCategory) 

+ (UIColor *)colorWithHex:(UInt32)col;
+ (UIColor *)colorWithHexString:(NSString *)str;

@end

//
//  UIColor_Categories.m
//
//  Created by Matthias Bauch on 24.11.10.
//  Copyright 2010 Matthias Bauch. All rights reserved.
//

#import "UIColor_Categories.h"

@implementation UIColor(MBCategory)

// takes @"#123456"
+ (UIColor *)colorWithHexString:(NSString *)str {
    const char *cStr = [str cStringUsingEncoding:NSASCIIStringEncoding];
    long x = strtol(cStr+1, NULL, 16);
    return [UIColor colorWithHex:x];
}

// takes 0x123456
+ (UIColor *)colorWithHex:(UInt32)col {
    unsigned char r, g, b;
    b = col & 0xFF;
    g = (col >> 8) & 0xFF;
    r = (col >> 16) & 0xFF;
    return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:1];
}

@end
Matthias Bauch
  • 89,811
  • 20
  • 225
  • 247
  • I know this is old now but I believe that you have to #import to actual be able to do UIColor(MBCategory) otherwise you get an error saying unable to find @interface UIColor. This could just have been an update since this was written, but it doesn't work without the import. – Popeye Jul 11 '12 at 14:27
  • It should work in a standard iOS project created by Xcode. The whole UIKit is imported in the precompiled header (ProjectName-Prefix.pch). – Matthias Bauch Jul 11 '12 at 16:22
  • This produces a warning on conversion from long to UInt32 which is unsigned. To remove this just cast the long to UInt32. You will never get negative numbers so it should be OK to do this. – Guy Lowe Apr 29 '19 at 05:17
25
//In your header file  

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]  

//usage  
UIColor *color = UIColorFromRGB(0x000000)  
//you can also use it inline  
[text.textField setTextColor:UIColorFromRGB(0xcccccc)]; 
5

Swift

It is very useful

extension UIColor {

    convenience init(hexString: String) {
        let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
        var int = UInt32()
        Scanner(string: hex).scanHexInt32(&int)
        let a, r, g, b: UInt32
        switch hex.count {
        case 3: // RGB (12-bit)
            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
        case 6: // RGB (24-bit)
            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
        case 8: // ARGB (32-bit)
            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
        default:
            (a, r, g, b) = (1, 1, 1, 0)
        }
        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
    }

    public func hexStringWithAlpha(_ includeAlpha: Bool) -> 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)

        if (includeAlpha) {
            return String(format: "%02X%02X%02X%02X", Int(r * 255), Int(g * 255), Int(b * 255), Int(a * 255))
        } else {
            return String(format: "%02X%02X%02X", Int(r * 255), Int(g * 255), Int(b * 255))
        }
    }

    open override var description: String {
        return self.hexStringWithAlpha(true)
    }

    open override var debugDescription: String {
        return self.hexStringWithAlpha(true)
    }
}

Obj-C

UIColor *organizationColor = [self colorWithHexString:@"#ababab" alpha:1];


- (UIColor *)colorWithHexString:(NSString *)str_HEX  alpha:(CGFloat)alpha_range{
    int red = 0;
    int green = 0;
    int blue = 0;
    sscanf([str_HEX UTF8String], "#%02X%02X%02X", &red, &green, &blue);
    return  [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
}
Mohamed Jaleel Nazir
  • 5,776
  • 3
  • 34
  • 48
0

Based on answers below. For SwiftUI you can do:

extension Color {
    init(hex: Int) {
        let red = (Double)((hex & 0xFF0000) >> 16) / 255.0
        let green = (Double)((hex & 0xFF00) >> 8) / 255.0
        let blue = (Double)((hex & 0xFF)) / 255.0

        self.init(red: red, green: green, blue: blue, opacity: 1.0)
    }
}
Fernando Martínez
  • 1,057
  • 10
  • 13