16 진수 문자열에서 UIColor를 어떻게 만들 수 있습니까?


답변:


722

가장 간단한 방법은 매크로를 사용하는 것입니다. 헤더에 포함하면 프로젝트 전체에서 사용할 수 있습니다.

#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]

16 진수 값을 가진 uicolor 매크로

이 코드의 형식화 된 버전 :

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

용법:

label.textColor = UIColorFromRGB(0xBC1128);

130
이것은 16 진수 문자열을 UIColor로 변환하는 것입니다. 정수를 UIColor로 변환합니다.
darrinm

31
@ MohamedA.Karim 16 진수 형식 문자열 ( "# ...")이 아닌 16 진수 형식 정수 (0x ...)에서 UIColor를 반환하는 예입니다. 그것이 당신이 원하는 것이지만 질문자가 요구 한 것이 아니라면 좋습니다.
darrinm

3
@ScottKohlert 코드 줄은 하나의 16 진수 형식 문자열 ( "#"접두사)을 다른 16 진수 형식 문자열 ( "0x"접두사)로 변환합니다. 정수를 생성하지 않습니다.
darrinm

1
[UIColor whiteColor] .CGColor와 같이 이것을 사용하는 방법?
SleepNot

3
이 매크로와 함께 사용하기 위해 16 진 형식 문자열을 정수로 변환하려면 stackoverflow.com/questions/3648411/…을 참조하십시오 .
devios1

371

간결한 솔루션 :

// Assumes input like "#00FF00" (#RRGGBB).
+ (UIColor *)colorFromHexString:(NSString *)hexString {
    unsigned rgbValue = 0;
    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    [scanner setScanLocation:1]; // bypass '#' character
    [scanner scanHexInt:&rgbValue];
    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

1
역변환을 수행하는 좋은 방법 (핵심 데이터 / 원격 데이터베이스에 색상을 저장하는 경우와 같은)은 여기에서 찾을 수 있습니다.- stackoverflow.com
Eric Goldberg

1
완벽한 솔루션. 16 진 문자열이 (매우 잘못 문서화 된) API에서 나온 경우 #FFF 또는 # FC0과 같은 속기 16 진 코드를 테스트해야합니다. # FFFFFF / # FFCCOO로 변경해야합니다.
Patrick

10
if ( [hexString rangeOfString:@"#"].location == 0 )앞에 추가 setScanLocation하여 #선택 사항 을 만들 수도 있습니다 .
devios1

반대 방법을 추가 할 수 있습니까?
hasan

11
게으른 : SWIFT 버전 here .
fabian789

188

Android에서 사용하는 16 진수 형식 문자열과 100 % 호환되는 솔루션을 얻었으며 크로스 플랫폼 모바일 개발을 수행 할 때 매우 유용합니다. 두 플랫폼 모두에 하나의 색상 구개를 사용할 수 있습니다. 속성없이 또는 원하는 경우 Apache 라이센스에 따라 재사용 할 수 있습니다.

#import "UIColor+HexString.h"

@interface UIColor(HexString)

+ (UIColor *) colorWithHexString: (NSString *) hexString;
+ (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length;

@end


@implementation UIColor(HexString)

+ (UIColor *) colorWithHexString: (NSString *) hexString {
    NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];
    CGFloat alpha, red, blue, green;
    switch ([colorString length]) {
        case 3: // #RGB
            alpha = 1.0f;
            red   = [self colorComponentFrom: colorString start: 0 length: 1];
            green = [self colorComponentFrom: colorString start: 1 length: 1];
            blue  = [self colorComponentFrom: colorString start: 2 length: 1];
            break;
        case 4: // #ARGB
            alpha = [self colorComponentFrom: colorString start: 0 length: 1];
            red   = [self colorComponentFrom: colorString start: 1 length: 1];
            green = [self colorComponentFrom: colorString start: 2 length: 1];
            blue  = [self colorComponentFrom: colorString start: 3 length: 1];          
            break;
        case 6: // #RRGGBB
            alpha = 1.0f;
            red   = [self colorComponentFrom: colorString start: 0 length: 2];
            green = [self colorComponentFrom: colorString start: 2 length: 2];
            blue  = [self colorComponentFrom: colorString start: 4 length: 2];                      
            break;
        case 8: // #AARRGGBB
            alpha = [self colorComponentFrom: colorString start: 0 length: 2];
            red   = [self colorComponentFrom: colorString start: 2 length: 2];
            green = [self colorComponentFrom: colorString start: 4 length: 2];
            blue  = [self colorComponentFrom: colorString start: 6 length: 2];                      
            break;
        default:
            [NSException raise:@"Invalid color value" format: @"Color value %@ is invalid.  It should be a hex value of the form #RBG, #ARGB, #RRGGBB, or #AARRGGBB", hexString];
            break;
    }
    return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
}

+ (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
    NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
    NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
    unsigned hexComponent;
    [[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
    return hexComponent / 255.0;
}

@end 

3
colorComponentFrom:start:length:해서는 안 return hexComponent / 0xFF; // divide by 255, not 256됩니까? 다시 가져와야하는 가장 큰 16 진수 값은 0xFF이므로 0xFF (255)로 나누어야합니다.
Sam

잘 잡는다 샘. 변경 사항을 반영하도록 편집되었습니다.
Micah Hainline

6
건배입니다. 또한 UIColor의 범주 대신 NSString에서 다음과 같은 구문을 사용할 수 있도록 만들 수 있습니다.[@"#538aa4" toColor]
Dan2552

2
이 솔루션은 훌륭합니다. 컴파일러 경고를 피하기 위해 개인 인터페이스 이름에 "Private"를 추가하는 것이 좋습니다. @interface UIColor (비공개)
djleop

1
좋은. 그러나 다른 기능을 인터페이스에 넣어야합니다 .
Bjorn Roche

63

UIColor16 진수 문자열에서 OP를 추출하는 OP의 문제를 해결하는 방법에 대한 좋은 게시물이 있습니다 . 아래 제시된 솔루션은 16 진 문자열 표현 앞에 '0x'또는 '#'이 포함 된 문자열 값을 지원하기 때문에 다른 솔루션과 다릅니다 ...

메인 비트는 다음과 같습니다.

- (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;
}

도우미 방법 ...

- (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;
}

용법:

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);

완전한 참조 기사

스위프트 2+

이 솔루션을 Swift 2.2로 포팅했습니다. alpha기본 설정 인 1.0을 사용 하도록 매개 변수를 변경했습니다 . 또한 Swift 2.2 UInt32NSScanner클래스가 요구하는대로 int 유형을 업데이트했습니다 .

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
}

스위프트 4+

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
}

컬러 16 진 참조

HTML 색상 이름 및 코드

16 진수 색상 코드


여기에 게시 된 Swift 스 니펫은 Swift의 옵션 옵션의 목적을 이해하지 못하는 것 같습니다.이 값은 절대 존재할 수 없습니다. 매개 변수가 선택적이어야하는지 묻는 질문은 누군가가이를 nil로 설정하는 능력이 필요한지 여부입니다. 그것은 가능성에 대한 이해 하는가 alpha지금까지 전무로 설정? 이 방법은 사람들에게 그 능력을 제공하고 누군가가 alphanil 로 설정 하기로 결정한 경우 해당 옵션을 강제로 풀면 충돌이 발생합니다. 그러나 내가 알지 못하는 타당한 이유가있는 경우를 대비하여 편집하지 않았습니다.
Jonathan Thornton

@JonathanThornton-감사합니다. 해결되었습니다.
Tommie C. 19

레거시 프로젝트와 Objective-C 솔루션에 대한 작업은 매우 효과적입니다 ... 예외적으로 ... @ ... # ffc107 "와 @"# e040fb "는 협력을 거부합니다! 생각?
Nathaniel

51

16 진 문자열을 받아 UIColor를 반환하는 함수입니다.
( #ffffff또는 다음 형식으로 16 진 문자열을 입력 할 수 있습니다. ffffff)

용법:

var color1 = hexStringToUIColor("#d3d3d3")

스위프트 4 :

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    if ((cString.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)
    )
}

스위프트 3 :

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    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)
    )
}

스위프트 2 :

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString

    if (cString.hasPrefix("#")) {
      cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
    }

    if ((cString.characters.count) != 6) {
      return UIColor.grayColor()
    }

    var rgbValue:UInt32 = 0
    NSScanner(string: cString).scanHexInt(&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)
    )
}



출처 : arshad / gist : de147c42d7b3063ef7bc


SVG에서 보았습니다. # F0F와 같은 3 개의 문자가있는 16 진수 문자열의 작은 버전이 있습니다.
Glenn Howes

'# F0F'는 '# FF00FF'와 같은 속기 표기법입니다. 속기를 확인하고 확장 한 함수를 작성하는 것은 간단합니다.
Ethan Strider

38

이 카테고리를 사용하십시오 :

UIColor + Hexadecimal.h 파일에서

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

+ (UIColor *)colorWithHexString:(NSString *)hexString;

@end

UIColor + Hexadecimal.m 파일에서

#import "UIColor+Hexadecimal.h"

@implementation UIColor(Hexadecimal)

+ (UIColor *)colorWithHexString:(NSString *)hexString {
    unsigned rgbValue = 0;
    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    [scanner setScanLocation:1]; // bypass '#' character
    [scanner scanHexInt:&rgbValue];

    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

@end

클래스에서 사용하고 싶습니다 :

#import "UIColor+Hexadecimal.h"

과:

[UIColor colorWithHexString:@"#6e4b4b"];

알파 취급 없음
Ihor Klimov

28

확장명을 사용하는 훌륭한 Swift 구현 (Xcode 7 용으로 업데이트 됨)은 다양한 답변과 장소에서 결합되었습니다. 끝에 문자열 확장이 필요합니다.

사용하다:

let hexColor = UIColor(hex: "#00FF00")

참고 : 알파 채널의 표준 6 자리 16 진수 값 끝에 2 개의 추가 숫자 옵션을 추가했습니다 ( 00- 값 통과 99). 이로 인해 기분이 상한 경우 제거하십시오. 선택적 알파 매개 변수를 전달하도록 구현할 수 있습니다.

신장:

extension UIColor {

    convenience init(var hex: String) {
        var alpha: Float = 100
        let hexLength = hex.characters.count
        if !(hexLength == 7 || hexLength == 9) {
            // A hex must be either 7 or 9 characters (#RRGGBBAA)
            print("improper call to 'colorFromHex', hex length must be 7 or 9 chars (#GGRRBBAA)")
            self.init(white: 0, alpha: 1)
            return
        }

        if hexLength == 9 {
            // Note: this uses String subscripts as given below
            alpha = hex[7...8].floatValue
            hex = hex[0...6]
        }

        // Establishing the rgb color
        var rgb: UInt32 = 0
        let s: NSScanner = NSScanner(string: hex)
        // Setting the scan location to ignore the leading `#`
        s.scanLocation = 1
        // Scanning the int into the rgb colors
        s.scanHexInt(&rgb)

        // Creating the UIColor from hex int
        self.init(
            red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgb & 0x0000FF) / 255.0,
            alpha: CGFloat(alpha / 100)
        )
    }
}

문자열 확장 :
플로트 소스
첨자 소스

extension String {

    /**
    Returns the float value of a string
    */
    var floatValue: Float {
        return (self as NSString).floatValue
    }

    /**
    Subscript to allow for quick String substrings ["Hello"][0...1] = "He"
    */
    subscript (r: Range<Int>) -> String {
        get {
            let start = self.startIndex.advancedBy(r.startIndex)
            let end = self.startIndex.advancedBy(r.endIndex - 1)
            return self.substringWithRange(start..<end)
        }
    }
}

또한 첨자를 얻기 위해 문자열 확장을 사용하고 있습니까? 예 : stackoverflow.com/a/24144365/3220708
Craig Grummitt

@CraigGrummitt 아 내! 하하 나는 때때로 (슬프게도) 표준 언어 기능 세트에 포함되어 있지 않은 것을 잊어 버린 확장 및 첨자 목록을 훌륭하게 편집했습니다. 귀하가 제공 한 출처를 포함하여 답변을 업데이트했습니다. 내가 거기에서 얻었는지 확실하지 않지만 확실하게 보입니다.
Firo

그것이 문자열 확장이라고 언급하고 싶을 수도 있습니다. : 또한 당신은 문자열하는 FloatValue 확장 놓친 것 같다 stackoverflow.com/a/24088249/3220708 그 외에는, 좋은 일을!
Craig Grummitt

countElements () func는 어디에 있습니까?
Ε Г И І И О

countElements()count()Swift 1.2에서이 언어 로 대체되었습니다 . 나는 그것을 반영하기 위해 대답을 업데이트했다.
Firo

27

이 같은 확장을 만들 수 있습니다

extension UIColor{
    convenience init(rgb: UInt, alphaVal: CGFloat) {
        self.init(
            red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgb & 0x0000FF) / 255.0,
            alpha: alphaVal
        )
    }
}

그리고 이런 식으로 어디서나 사용하십시오

UIColor(rgb: 0xffffff, alphaVal: 0.2)

간단하게 죽었습니다.
이론

고마워,이 하나의 위대한, 그래서 다른 텍스트 벽에 비해 간결합니다!
FrankByte.com

좋은 기능이지만 질문에 대답하지 않습니다.
mah

@ mah 이것은 정확히 내가 생각하는 질문입니다, 16 진수 문자열에서 UIColor를 만드는 방법
Manu Gupta

@ ManuGupta이 답변에서 문자열 처리가 완전히 부족하다는 것을 알 수 있습니다. 16 진수는 16 진 문자열이 아닙니다. 이 질문은 문자열을 명시 적으로 나타내며 따옴표가 없지만 #00FF00분명히 문자열입니다. 다른 사람들이 말했듯이 간단하고 간결합니다. 그러나 문자열을 다루지 않으면 문자열을 다루는 방법을 묻는 질문에 대답 할 수 없습니다.
mah

26

16 진수 문자열에서 내가 알고 있는 UIColor(또는 CGColor) 으로의 기본 변환은 없습니다 . 그러나이 목적을 위해 몇 가지 기능을 쉽게 작성할 수 있습니다 (예 : uicolor 구성 요소에 액세스하는 iPhone 개발 참조)


3
+1 아래로 스크롤하면 해당 메소드는 + colorWithHexString :입니다.
Rob Napier

1
@RobNapier +colorWithHexString:가 작동하지 않습니다. 적어도 내 경우에는. :)
पवन

15

UIColor + PXExtensions에UIColor 대한 좋은 카테고리를 찾았 습니다 .

용법: UIColor *mycolor = [UIColor pxColorWithHexValue:@"#BADA55"];

그리고 내 요지에 대한 링크가 실패하는 경우 실제 구현 코드는 다음과 같습니다.

//
//  UIColor+PXExtensions.m
//

#import "UIColor+UIColor_PXExtensions.h"

@implementation UIColor (UIColor_PXExtensions)

+ (UIColor*)pxColorWithHexValue:(NSString*)hexValue
{
    //Default
    UIColor *defaultResult = [UIColor blackColor];

    //Strip prefixed # hash
    if ([hexValue hasPrefix:@"#"] && [hexValue length] > 1) {
        hexValue = [hexValue substringFromIndex:1];
    }

    //Determine if 3 or 6 digits
    NSUInteger componentLength = 0;
    if ([hexValue length] == 3)
    {
        componentLength = 1;
    }
    else if ([hexValue length] == 6)
    {
        componentLength = 2;
    }
    else
    {
        return defaultResult;
    }

    BOOL isValid = YES;
    CGFloat components[3];

    //Seperate the R,G,B values
    for (NSUInteger i = 0; i < 3; i++) {
        NSString *component = [hexValue substringWithRange:NSMakeRange(componentLength * i, componentLength)];
        if (componentLength == 1) {
            component = [component stringByAppendingString:component];
        }
        NSScanner *scanner = [NSScanner scannerWithString:component];
        unsigned int value;
        isValid &= [scanner scanHexInt:&value];
        components[i] = (CGFloat)value / 256.0f;
    }

    if (!isValid) {
        return defaultResult;
    }

    return [UIColor colorWithRed:components[0]
                           green:components[1]
                            blue:components[2]
                           alpha:1.0];
}

@end

@PeterDuniho 좋아, 구현 코드를 추가했다 :)
Hlung

13

신속한 버전. 함수 또는 확장으로 사용하십시오.

함수
  func UIColorFromRGB(colorCode: String, alpha: Float = 1.0) -> UIColor{
    var scanner = NSScanner(string:colorCode)
    var color:UInt32 = 0;
    scanner.scanHexInt(&color)

    let mask = 0x000000FF
    let r = CGFloat(Float(Int(color >> 16) & mask)/255.0)
    let g = CGFloat(Float(Int(color >> 8) & mask)/255.0)
    let b = CGFloat(Float(Int(color) & mask)/255.0)

    return UIColor(red: r, green: g, blue: b, alpha: CGFloat(alpha))
}
신장
extension UIColor {
    convenience init(colorCode: String, alpha: Float = 1.0){
        var scanner = NSScanner(string:colorCode)
        var color:UInt32 = 0;
        scanner.scanHexInt(&color)

        let mask = 0x000000FF
        let r = CGFloat(Float(Int(color >> 16) & mask)/255.0)
        let g = CGFloat(Float(Int(color >> 8) & mask)/255.0)
        let b = CGFloat(Float(Int(color) & mask)/255.0)

        self.init(red: r, green: g, blue: b, alpha: CGFloat(alpha))
    }
}
전화하는 방법
let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
Hex Colorfrom 인터페이스 빌더를 정의 할 수도 있습니다 .

여기에 이미지 설명을 입력하십시오


12

이것은 또 다른 대안입니다.

- (UIColor *)colorWithRGBHex:(UInt32)hex
{
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex) & 0xFF;

    return [UIColor colorWithRed:r / 255.0f
                           green:g / 255.0f
                            blue:b / 255.0f
                           alpha:1.0f];
}

이 페이지의 질문에 대한 합리적인 대답은 아닙니다.
mah

11

다양한 온라인 도구를 사용하여 HEX 문자열을 실제 UIColor로 변환 할 수 있습니다. uicolor.org 또는 UI 색상 선택기를 확인하십시오 . 출력은 다음과 같이 Objective-C 코드로 변환됩니다.

[UIColor colorWithRed:0.93 green:0.80 blue:0.80 alpha:1.0];

응용 프로그램에 포함시킬 수 있습니다. 도움이 되었기를 바랍니다!


실제로 동일한 이름의 다른 온라인 도구 인 UI 색상 선택기 .
Joe

일반적으로 사람들이 이와 같은 매우 간단한 문제를 해결하기 위해 코드에 대한 도움을 요청할 때 "첫 번째 온라인 사이트로 이동합니다 ..."라는 답변은 실제로 원하는 사람이 원하는 답변에 가깝지 않습니다.
mah

11

스위프트 4

convenience확장에서 다음과 같이 멋진 생성자를 만들 수 있습니다 .

extension UIColor {
    convenience init(hexString: String, alpha: CGFloat = 1.0) {
        var hexInt: UInt32 = 0
        let scanner = Scanner(string: hexString)
        scanner.charactersToBeSkipped = CharacterSet(charactersIn: "#")
        scanner.scanHexInt32(&hexInt)

        let red = CGFloat((hexInt & 0xff0000) >> 16) / 255.0
        let green = CGFloat((hexInt & 0xff00) >> 8) / 255.0
        let blue = CGFloat((hexInt & 0xff) >> 0) / 255.0
        let alpha = alpha

        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
}

그리고 나중에처럼 사용하십시오

let color = UIColor(hexString: "#AABBCCDD")

'scanHexInt32'는 iOS 13.0에서 더 이상 사용되지 않습니다.
Cosmo Arun

10
extension UIColor {
    convenience init(hexaString: String, alpha: CGFloat = 1) {
        let chars = Array(hexaString.dropFirst())
        self.init(red:   .init(strtoul(String(chars[0...1]),nil,16))/255,
                  green: .init(strtoul(String(chars[2...3]),nil,16))/255,
                  blue:  .init(strtoul(String(chars[4...5]),nil,16))/255,
                  alpha: alpha)}
}

용법:

let redColor       = UIColor(hexaString: "#FF0000")              // r 1,0 g 0,0 b 0,0 a 1,0
let transparentRed = UIColor(hexaString: "#FF0000", alpha: 0.5)  // r 1,0 g 0,0 b 0,0 a 0,5


4

알파를 가진 다른 버전

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

4

투명성을 지원하기 위해 RGBA Int 값을 수신하지만 @Tom의 답변과 동일합니다.

func colorWithHex(aHex: UInt) -> UIColor
{
    return UIColor(red: CGFloat((aHex & 0xFF000000) >> 24) / 255,
        green: CGFloat((aHex & 0x00FF0000) >> 16) / 255,
        blue: CGFloat((aHex & 0x0000FF00) >> 8) / 255,
        alpha: CGFloat((aHex & 0x000000FF) >> 0) / 255)
}

//usage
var color = colorWithHex(0x7F00FFFF)

그리고 문자열에서 사용하려면 strtoul을 사용할 수 있습니다.

var hexString = "0x7F00FFFF"

let num = strtoul(hexString, nil, 16)

var colorFromString = colorWithHex(num)

4

Swift 1.2확장명으로 작성된 버전은 다음과 같습니다 UIColor. 이것은 당신이 할 수 있습니다

let redColor = UIColor(hex: "#FF0000")

내가 느끼는 것이 가장 자연스러운 방법입니다.

extension UIColor {
  // Initialiser for strings of format '#_RED_GREEN_BLUE_'
  convenience init(hex: String) {
    let redRange    = Range<String.Index>(start: hex.startIndex.advancedBy(1), end: hex.startIndex.advancedBy(3))
    let greenRange  = Range<String.Index>(start: hex.startIndex.advancedBy(3), end: hex.startIndex.advancedBy(5))
    let blueRange   = Range<String.Index>(start: hex.startIndex.advancedBy(5), end: hex.startIndex.advancedBy(7))

    var red     : UInt32 = 0
    var green   : UInt32 = 0
    var blue    : UInt32 = 0

    NSScanner(string: hex.substringWithRange(redRange)).scanHexInt(&red)
    NSScanner(string: hex.substringWithRange(greenRange)).scanHexInt(&green)
    NSScanner(string: hex.substringWithRange(blueRange)).scanHexInt(&blue)

    self.init(
      red: CGFloat(red) / 255,
      green: CGFloat(green) / 255,
      blue: CGFloat(blue) / 255,
      alpha: 1
    )
  }
}

Xcode 6.3.2에서 시작하는 줄 let greenRange = ...에 예외가 있습니다.fatal error: can not increment endIndex
Clifton Labrum

@CliftonLabrum Xcode 7 베타 3에서 이것을 테스트했으며 동일하게 작동합니다. 여전히이 문제가 있습니까?
Morgan Wilde

3

알파와 같이 "FFF"또는 "FFFFFF"알파를 사용 하는 문자열을 허용하는 또 다른 구현 :

+ (UIColor *) colorFromHexString:(NSString *)hexString alpha: (CGFloat)alpha{
    NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
    if([cleanString length] == 3) {
        cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@",
                       [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)],
                       [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)],
                       [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]];
    }
    if([cleanString length] == 6) {
        cleanString = [cleanString stringByAppendingString:@"ff"];
    }

    unsigned int baseValue;
    [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue];

    float red = ((baseValue >> 24) & 0xFF)/255.0f;
    float green = ((baseValue >> 16) & 0xFF)/255.0f;
    float blue = ((baseValue >> 8) & 0xFF)/255.0f;

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

3

신속한 1.2 업데이트

class func colorWithHexString (hex:String) -> UIColor {
    var cString: NSString = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString

    if (cString.hasPrefix("#")) {
        cString = cString.substringFromIndex(1)
    }

    if (count(cString as String) != 6) {
        return UIColor.grayColor()
    }

    var rString: String = cString.substringToIndex(2)
    var gString: String = (cString.substringFromIndex(2) as NSString).substringToIndex(2)
    var bString: String = (cString.substringFromIndex(4) as NSString).substringToIndex(2)

    var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
    NSScanner(string: rString).scanHexInt(&r)
    NSScanner(string: gString).scanHexInt(&g)
    NSScanner(string: bString).scanHexInt(&b)
    return UIColor(red: CGFloat(Float(r) / 255.0), green: CGFloat(Float(g) / 255.0), blue: CGFloat(Float(b) / 255.0), alpha: CGFloat(1))

}

3

에 대한 우아한 확장 만들기 UIColor:

extension UIColor {

convenience init(string: String) {

        var uppercasedString = string.uppercased()
        uppercasedString.remove(at: string.startIndex)

        var rgbValue: UInt32 = 0
        Scanner(string: uppercasedString).scanHexInt32(&rgbValue)

        let red = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
        let green = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
        let blue = CGFloat(rgbValue & 0x0000FF) / 255.0

        self.init(red: red, green: green, blue: blue, alpha: 1)
    }
}

붉은 색 만들기 :

let red = UIColor(string: "#ff0000") 

3
extension UIColor 
{
    class func fromHexaString(hex:String) -> UIColor
    {
        let scanner           = Scanner(string: hex)
        scanner.scanLocation  = 0
        var rgbValue: UInt64  = 0
        scanner.scanHexInt64(&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)
        )
    }
}

//you can call like this.

UIColor.fromHexaString(hex:3276b1)

2
 You Can Get UIColor From String Code Like
   circularSpinner.fillColor = [self getUIColorObjectFromHexString:@"27b8c8" alpha:9];

 //Function For Hex Color Use
    - (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;
    }




    - (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
    {
        // Convert hex string to an integer
        unsigned int hexint = [self intFromHexString:hexStr];

        // Create 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;
    }

    /Function For Hex Color Use
    - (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;
    }




    - (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
    {
        // Convert hex string to an integer
        unsigned int hexint = [self intFromHexString:hexStr];

        // Create 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;
    }

이 코드를 사용하려면 [self getUIColorObjectFromHexString : @ "27b8c8"alpha : 9]; 만 ....
Manish Saini

2

나는 색상 외에 알파를 보장하고 싶습니다. 그래서 나만의 카테고리를 작성합니다.

+ (UIColor *) colorWithHex:(int)color {

    float red = (color & 0xff000000) >> 24;
    float green = (color & 0x00ff0000) >> 16;
    float blue = (color & 0x0000ff00) >> 8;
    float alpha = (color & 0x000000ff);

    return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha/255.0];
}

이처럼 사용하기 쉬운

[UIColor colorWithHex:0xFF0000FF]; //Red
[UIColor colorWithHex:0x00FF00FF]; //Green
[UIColor colorWithHex:0x00FF00FF]; //Blue
[UIColor colorWithHex:0x0000007F]; //transparent black

2

나는 그것을 위해 편리한 초기화를 만들었습니다.

extension UIColor {
convenience init(hex: String, alpha: CGFloat)
{
    let redH = CGFloat(strtoul(hex.substringToIndex(advance(hex.startIndex,2)), nil, 16))
    let greenH = CGFloat(strtoul(hex.substringWithRange(Range<String.Index>(start: advance(hex.startIndex, 2), end: advance(hex.startIndex, 4))), nil, 16))
    let blueH = CGFloat(strtoul(hex.substringFromIndex(advance(hex.startIndex,4)), nil, 16))

    self.init(red: redH/255, green: greenH/255, blue: blueH/255, alpha: alpha)
}
}

다음과 같이 프로젝트의 어느 곳에서나 UIColor를 만들 수 있습니다.

UIColor(hex: "ffe3c8", alpha: 1)

도움이 되었기를 바랍니다...


2

UIColor의 확장 클래스를 다음과 같이 만들 수 있습니다.

확장 UIColor {

// MARK :-getColorFromHex / **이 함수는 색상 16 진 코드를 RGB로 변환합니다.

- parameter color  hex string.

- returns: RGB color code.
*/
class func getColorFromHex(hexString:String)->UIColor{

    var rgbValue : UInt32 = 0
    let scanner:NSScanner =  NSScanner(string: hexString)

    scanner.scanLocation = 1
    scanner.scanHexInt(&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))
}

}


2

신속한 2.0 이상. 이 코드는 나에게 잘 작동합니다.

extension UIColor {
    /// UIColor(hexString: "#cc0000")
    internal convenience init?(hexString:String) {
        guard hexString.characters[hexString.startIndex] == Character("#") else {
            return nil
        }
        guard hexString.characters.count == "#000000".characters.count else {
            return nil
        }
        let digits = hexString.substringFromIndex(hexString.startIndex.advancedBy(1))
        guard Int(digits,radix:16) != nil else{
            return nil
        }
        let red = digits.substringToIndex(digits.startIndex.advancedBy(2))
        let green = digits.substringWithRange(Range<String.Index>(start: digits.startIndex.advancedBy(2),
            end: digits.startIndex.advancedBy(4)))
        let blue = digits.substringWithRange(Range<String.Index>(start:digits.startIndex.advancedBy(4),
            end:digits.startIndex.advancedBy(6)))
        let redf = CGFloat(Double(Int(red, radix:16)!) / 255.0)
        let greenf = CGFloat(Double(Int(green, radix:16)!) / 255.0)
        let bluef = CGFloat(Double(Int(blue, radix:16)!) / 255.0)
        self.init(red: redf, green: greenf, blue: bluef, alpha: CGFloat(1.0))
    }
}

이 코드에는 문자열 형식 검사가 포함됩니다. 예 :

let aColor = UIColor(hexString: "#dadada")!
let failed = UIColor(hexString: "123zzzz")

그리고 내가 아는 한 내 코드는 실패 조건의 의미를 유지하고 선택적 값을 반환하는 데 불리하지 않습니다. 그리고 이것이 가장 좋은 대답이어야합니다.


2

색상의 알파 값을 처리하고 완벽한 오류 처리 기능을 갖춘 Swift 2.0 버전의 솔루션은 다음과 같습니다.

func RGBColor(hexColorStr : String) -> UIColor?{

    var red:CGFloat = 0.0
    var green:CGFloat = 0.0
    var blue:CGFloat = 0.0
    var alpha:CGFloat = 1.0

    if hexColorStr.hasPrefix("#"){

        let index   = hexColorStr.startIndex.advancedBy(1)
        let hex     = hexColorStr.substringFromIndex(index)
        let scanner = NSScanner(string: hex)
        var hexValue: CUnsignedLongLong = 0

        if scanner.scanHexLongLong(&hexValue)
        {
            if hex.characters.count == 6
            {
                red   = CGFloat((hexValue & 0xFF0000) >> 16) / 255.0
                green = CGFloat((hexValue & 0x00FF00) >> 8)  / 255.0
                blue  = CGFloat(hexValue & 0x0000FF) / 255.0
            }
            else if hex.characters.count == 8
            {
                red   = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0
                green = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0
                blue  = CGFloat((hexValue & 0x0000FF00) >> 8)  / 255.0
                alpha = CGFloat(hexValue & 0x000000FF)         / 255.0
            }
            else
            {
                print("invalid hex code string, length should be 7 or 9", terminator: "")
                return nil
            }
        }
        else
        {
            print("scan hex error")
       return nil
        }
    }

    let color: UIColor =  UIColor(red:CGFloat(red), green: CGFloat(green), blue:CGFloat(blue), alpha: alpha)
    return color
}

2
    //UIColorWithHexString

    static UIColor * UIColorWithHexString(NSString *hex) {
        unsigned int rgb = 0;
        [[NSScanner scannerWithString:
          [[hex uppercaseString] stringByTrimmingCharactersInSet:
           [[NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet]]]
         scanHexInt:&rgb];
        return [UIColor colorWithRed:((CGFloat)((rgb & 0xFF0000) >> 16)) / 255.0
                               green:((CGFloat)((rgb & 0xFF00) >> 8)) / 255.0
                                blue:((CGFloat)(rgb & 0xFF)) / 255.0
                               alpha:1.0];
    }

용법

self.view.backgroundColor = UIColorWithHexString(@"#0F35C0");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.