ios Преобразовать целочисленный цвет в uicolor или шестнадцатеричные значения?

В Android есть опция, в которой вы можете установить цвет на основе значения int. Могу ли я использовать это значение или преобразовать это значение, чтобы установить его как UIColor в iOS? Например, это значение -5242884 можно использовать в Android для установки цвета.

Из того, что мне удалось найти, это то, что iOS широко использует шестнадцатеричное значение или значение rgb для установки UIColor. Но я не смог найти никакой информации о моей проблеме здесь. В любом случае, я могу использовать значение int вместо этого.


person IssacZH.    schedule 10.01.2014    source источник
comment
Что представляет отрицательное целое число?   -  person rmaddy    schedule 10.01.2014
comment
На самом деле это значение цвета, которое можно установить на стороне Android. В Android я могу преобразовать это отрицательное целочисленное значение в шестнадцатеричное значение. Но я хотел знать, могу ли я преобразовать это значение в iOS или нет.   -  person IssacZH.    schedule 10.01.2014
comment
Тип int имеет 4 байта. Первый байт соответствует красному значению, второй — зеленому, третий — синему, последний — альфа?   -  person KudoCC    schedule 10.01.2014
comment
@KudoCC Честно говоря, я не совсем уверен, что означает это значение int. Я сам немного не в курсе всего этого.   -  person IssacZH.    schedule 10.01.2014
comment
Я думаю, вы должны знать, что это за цветовое пространство. Если он использует RGB, вам все равно нужно заботиться об ARGB и RGBA.   -  person KudoCC    schedule 10.01.2014
comment
Нет смысла иметь отрицательное значение.   -  person rmaddy    schedule 10.01.2014
comment
@rmaddy Я согласился. Потому что я тоже не вижу в этом смысла. Но вы можете проверить это на Android, я не знаю, почему работает отрицательное значение, но оно просто работает.   -  person IssacZH.    schedule 10.01.2014
comment
Как я могу протестировать Android? Контекста нет. Какой алгоритм используется для преобразования отрицательного значения в RGB?   -  person rmaddy    schedule 10.01.2014
comment
Просто проверьте это таким образом. Установите его на вид. Он принимает значение int. Например, view.setBackgroundColor(color) Определите color как значение выше.   -  person IssacZH.    schedule 10.01.2014
comment
Смотрите мой обновленный ответ ниже. Я думаю, что теперь это отвечает на ваш вопрос.   -  person nalyd88    schedule 10.01.2014


Ответы (3)


Похоже, что целое число, на которое вы ссылаетесь, является упакованным целым числом. См. документацию по цвету Android. Вам нужно найти способ преобразовать упакованный int в шестнадцатеричный, а затем вы можете использовать этот макрос (полученный здесь ), который преобразует шестнадцатеричное число в UIColor:

#define HEXCOLOR(c) [UIColor colorWithRed:((c>>24)&0xFF)/255.0 green:((c>>16)&0xFF)/255.0 blue:((c>>8)&0xFF)/255.0  alpha:((c)&0xFF)/255.0]

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

Изменить

Итак, я только что понял, что приведенный выше макрос действительно решает вашу проблему. Просто дайте ему целочисленное представление, и он даст вам правильный UIColor. Мой тестовый код ниже:

UIColor *color = HEXCOLOR(-16776961); // Blue const from android link above
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]]; 
NSLog(@"%@",colorAsString); // Prints 1.0 0.0 0.0 1.0 which corresponds to 0xff0000ff

Мне помогли здесь.

Изменить

Исправлен макрос для ожидания правильных значений RGBA:

#define ANDROID_COLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 green:((c>>8)&0xFF)/255.0 blue:((c)&0xFF)/255.0  alpha:((c>>24)&0xFF)/255.0]

Предыдущий макрос ожидал RGBA, в то время как Android color int давал ARGB.

person nalyd88    schedule 10.01.2014
comment
Спасибо, я ценю это. я посмотрю на это - person IssacZH.; 10.01.2014
comment
UIColor *color = HEXCOLOR(-16776961); Значение в color возвращается синим цветом в Android, но красным в iOS. =( Каким-то образом марко сработало, но неточно. - person IssacZH.; 10.01.2014
comment
@ИсаакЖ. Я думаю, что это связано с порядком значений RGBA. Цвет Android, вероятно, ARGB, а UIColor — RGBA, поэтому в примере в основном красный и синий были бы заменены местами. Измените макрос, чтобы расположить их в правильном порядке. Я опубликую редактирование своего ответа. - person nalyd88; 10.01.2014
comment
Это сработало! Большое спасибо цвет теперь соответствует андроиду. Ты спасатель. =) Если это не слишком много, могу ли я спросить, можно ли преобразовать его наоборот из шестнадцатеричного или rgb значения? - person IssacZH.; 10.01.2014
comment
Я не работал с этим таким образом, но я предполагаю, что это возможно. Попробуйте реконструировать макрос. Начните с цветовых компонентов в шестнадцатеричном формате, затем сдвиньте биты в другую сторону (‹‹) и ИЛИ их вместе. Удачи. Рад, что смог помочь! - person nalyd88; 10.01.2014

Вот решение для преобразования значения HEX в UIColor https://gist.github.com/Galeas/8348748

person Akki    schedule 10.01.2014

Версия Swift, если это кому-то поможет:

func getUIColorFromAndroidColorInt(androidColorInt: Int) -> UIColor {

        let red = (CGFloat) ( (androidColorInt>>16)&0xFF )
        let green = (CGFloat) ( (androidColorInt>>8)&0xFF )
        let blue = (CGFloat) ( (androidColorInt)&0xFF )

        return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1)

    }
person Nerdy Bunz    schedule 27.12.2018