Преобразование RGBA HEX в UIColor [дубликат]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

Он выкинет NullReferenceException в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

13
задан dipu 9 June 2010 в 22:47
поделиться

4 ответа

Вы близки, но colorWithRed: green: blue: alpha: ожидает значения от 0.0 до 1.0, поэтому вам нужно сдвинуть биты вправо и разделить на 255.0f:

CGFloat red   = ((baseColor1 & 0xFF0000) >> 16) / 255.0f;
CGFloat green = ((baseColor1 & 0x00FF00) >>  8) / 255.0f;
CGFloat blue  =  (baseColor1 & 0x0000FF) / 255.0f;

EDIT. Также сканирование NSScannerHexInt пропустит минус 0x перед шестнадцатеричной строкой, но я не думаю, что он пропустит символ # перед вашей шестнадцатеричной строкой. Вы можете добавить эту строку, чтобы обработать это:

[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; 
25
ответ дан progrmr 24 August 2018 в 10:06
поделиться
  • 1
    Хорошее умное и элегантное решение! Хорошая работа! – ninehundredt 10 October 2012 в 16:04

ссылаются на эту ссылку для преобразования шестнадцатеричной строки в объектный код c

http://www.touch-code-magazine.com/web-color-to-uicolor-convertor

0
ответ дан gunas 24 August 2018 в 10:06
поделиться

Я добавил замену строки, поэтому он принимает шестую строку с или без #

Возможный полный код:

+ (UIColor *)colorWithHexString:(NSString *)stringToConvert
{
    NSString *noHashString = [stringToConvert stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #
    NSScanner *scanner = [NSScanner scannerWithString:noHashString];
    [scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; // remove + and $

    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    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];
}
12
ответ дан Lucien 24 August 2018 в 10:06
поделиться
  • 1
    Это отлично, спасибо. Однако не устанавливает ли charactersToBeSkipped на сканере необходимость в замене строки #? – devios1 27 April 2015 в 20:55

Я выполнил функцию, которая работает в следующих случаях: - 1) с или без # 2) и длинные значения 3 и 6 символов # 000, а также # 000000 3) В случае дополнительных цифр более шести он игнорирует дополнительные цифры

//Function Call
UIColor *organizationColor = [self colorWithHexString:@"#AAAAAAAAAAAAA" alpha:1];

//Function
- (UIColor *)colorWithHexString:(NSString *)str_HEX  alpha:(CGFloat)alpha_range{
    NSString *noHashString = [str_HEX stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #

    int red = 0;
    int green = 0;
    int blue = 0;

if ([str_HEX length]<=3)
    {
        sscanf([noHashString UTF8String], "%01X%01X%01X", &red, &green, &blue);
        return  [UIColor colorWithRed:red/16.0 green:green/16.0 blue:blue/16.0 alpha:alpha_range];
    }
else if ([str_HEX length]>7)
    {
        NSString *mySmallerString = [noHashString substringToIndex:6];
        sscanf([mySmallerString UTF8String], "%02X%02X%02X", &red, &green, &blue);
        return  [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
    }
else
{
    sscanf([noHashString UTF8String], "%02X%02X%02X", &red, &green, &blue);
    return  [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
}}
1
ответ дан Md. Ibrahim Hassan 24 August 2018 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: