Как преобразовать цветовые коды HEX RGB в UIColor? - PullRequest
65 голосов
/ 27 сентября 2010

У меня есть шестнадцатеричный код RGB, такой как #ffffff, как NSString, и я хочу преобразовать его в UIColor. Есть ли простой способ сделать это?

Ответы [ 17 ]

102 голосов
/ 27 сентября 2010

В моем коде я использую 2 разные функции:

void SKScanHexColor(NSString * hexString, float * red, float * green, float * blue, float * 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];

  if (red) { *red = ((baseValue >> 24) & 0xFF)/255.0f; }
  if (green) { *green = ((baseValue >> 16) & 0xFF)/255.0f; }
  if (blue) { *blue = ((baseValue >> 8) & 0xFF)/255.0f; }
  if (alpha) { *alpha = ((baseValue >> 0) & 0xFF)/255.0f; }
}

А потом я использую это так:

UIColor * SKColorFromHexString(NSString * hexString) {
  float red, green, blue, alpha;
  SKScanHexColor(hexString, &red, &green, &blue, &alpha);

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

Если вы предпочитаете использовать это в качестве категории UIColor, то просто измените несколько строк:

+ (UIColor *) colorFromHexString:(NSString *)hexString {
  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;
  float alpha = ((baseValue >> 0) & 0xFF)/255.0f;

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

Это будет обрабатывать строки вроде "#abc", "# abcdef31" и т. Д.

84 голосов
/ 27 сентября 2010

Если вы используете шестнадцатеричные значения ..

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

  //Then use any Hex value

 self.view.backgroundColor = UIColorFromRGB(0xD2691E);   
34 голосов
/ 06 марта 2013

Я искал простое решение и придумал это (не полностью Objective-C, но работает как шарм):

NSString *stringColor = @"#AABBCC";
NSUInteger red, green, blue;
sscanf([stringColor UTF8String], "#%02X%02X%02X", &red, &green, &blue);

UIColor *color = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1];
19 голосов
/ 02 июля 2011

Существует замечательная категория для UIColor с именем "UIColor + Expanded" , в которой есть метод класса для получения UIColor из шестнадцатеричной строки RGB:

Его просто использовать:

UIColor *myColor = [UIColor colorWithHexString:@"FF0000"];

Кроме того, он добавляет множество других потенциально полезных утилит в UIColor.Более подробная информация доступна в этой статье .

10 голосов
/ 05 мая 2012

Легко, просто зайдите на этот сайт и введите свое шестнадцатеричное значение: http://www.corecoding.com/utilities/rgb-or-hex-to-float.php

7 голосов
/ 16 октября 2013
+ (UIColor *)colorWithHexString:(NSString *)colorString
{
    colorString = [colorString stringByReplacingOccurrencesOfString:@"#" withString:@""];

    if (colorString.length == 3)
        colorString = [NSString stringWithFormat:@"%c%c%c%c%c%c",
        [colorString characterAtIndex:0], [colorString characterAtIndex:0],
        [colorString characterAtIndex:1], [colorString characterAtIndex:1],
        [colorString characterAtIndex:2], [colorString characterAtIndex:2]];

    if (colorString.length == 6)
    {
        int r, g, b;
        sscanf([colorString UTF8String], "%2x%2x%2x", &r, &g, &b);
        return [UIColor colorWithRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0];
    }
    return nil;
}

для формата # 123, 123, # fff195, fff195

+ (UIColor *)colorWithHexValue:(int)hexValue
{
    float red   = ((hexValue & 0xFF0000) >> 16)/255.0;
    float green = ((hexValue & 0xFF00) >> 8)/255.0;
    float blue  = (hexValue & 0xFF)/255.0;
    return [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}

для формата 0xfff195

5 голосов
/ 09 апреля 2013

Самый простой способ, который я нашел: Преобразователь шестнадцатеричного кода в UIColor

Просто введите шестнадцатеричное число без '#', и он вернет код UIColor.Например, код для оранжевого цвета (# f77f00):

[UIColor colorWithRed:0.969 green:0.498 blue:0 alpha:1.0]
3 голосов
/ 27 сентября 2010

Думаю, я бы разделил шесть символов на три пары, затем преобразовал их в десятичную, а затем разделил на 255, чтобы получить каждый компонент цвета в виде числа с плавающей точкой.

Затем вы можете передать компоненты:

[UIColor colorWithRed: green: blue: alpha:1];
3 голосов
/ 27 апреля 2015

Я создал онлайн-инструмент для мгновенного преобразования любого шестнадцатеричного кода во фрагмент кода UIColor для Swift и Objective-C, когда неудобно использовать пользовательские методы или плагины: https://iosref.com/uihex/

2 голосов
/ 07 мая 2015

Если вам сложно перейти с ObjectiveC на swift, вот ответ с помощью Swift. В настоящее время он принимает только строки без #, но вы можете добавить метод сканера, чтобы пропустить его.

func stringToColor(stringColor: String) -> UIColor {
    var hexInt: UInt32 = 0
    let scanner = NSScanner(string: stringColor)
    scanner.scanHexInt(&hexInt)
    let color = UIColor(
        red: CGFloat((hexInt & 0xFF0000) >> 16)/255,
        green: CGFloat((hexInt & 0xFF00) >> 8)/255,
        blue: CGFloat((hexInt & 0xFF))/255,
        alpha: 1)

    return color
}
...