Получение цветов пользовательского интерфейса по умолчанию на iPhone

ПРЕАМБУЛА: начиная с iOS 13 с темной темой, в iOS существует правильное представление о системных цветах. См. Класс UIColor.


Вот мой проект iPhone с файлом XIB с обычным UIButton на нем. Кнопка имеет текстовый цвет - приятный оттенок синего, точнее RGB (50, 79, 133).

Есть ли быстрый и правильный способ получить это значение цвета во время выполнения? Не цвет этой конкретной кнопки, а цвет текста UIButtons по умолчанию? Желательно как UIColor * или CGColorRef.

Есть ли на iPhone понятие системных цветов, или это просто значение по умолчанию, обеспечиваемое предустановками в Интерфейсном Разработчике?

Да, я могу выполнить элементарную математику и преобразовать RGB в представление с плавающей точкой (UGH!), Которое использует UIColor. Что-нибудь более элегантное, чем это?


person Seva Alekseyev    schedule 16.02.2011    source источник


Ответы (2)


Для проблемы с UIColor я могу предложить добавить категорию к UIColor, например:

UIColor + Extras.h

#import <UIKit/UIKit.h>

@interface UIColor(Extras)
+ (UIColor *)colorWithRGBA:(NSUInteger) rgba;
+ (UIColor *)colorWithRGB:(NSUInteger) rgb;
@end

UIColor + Extras.m

#import "UIColor+Extras.h"

@implementation UIColor(Extras)
+ (UIColor *)colorWithRGBA:(NSUInteger) rgba
{
    return [UIColor colorWithRed:(rgba >> 24) / 255.0f green:(0xff & ( rgba >> 16)) / 255.0f blue:(0xff & ( rgba >> 8)) / 255.0f alpha:(0xff & rgba) / 255.0f];
}

+ (UIColor *)colorWithRGB:(NSUInteger) rgb
{
    return [UIColor colorWithRed:(rgb >> 16) / 255.0f green:(0xff & ( rgb >> 8)) / 255.0f blue:(0xff & rgb) / 255.0f alpha:1.0];
}
@end

Это позволит вам писать такие вещи, как [UIColor colorWithRGBA:0xFF00FFFF] или [UIColor colorWithRGB:0xFF00FF]

Что касается начальных значений цвета, некоторые из них задокументированы в файлах заголовков, например UIButton.h, а также есть некоторые цвета, доступные в качестве методов класса в UIColor, например [UIColor lightTextColor] [UIColor darkTextColor] и т. Д. ссылка на класс UIColor.

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIColor_Class/Reference/Reference.html

Если вы хотите получить цвет по умолчанию, всегда есть:

[[button titleLabel] textColor]

Получить цвет текста любой кнопки. Если вам нужен цвет по умолчанию, создайте скрытую кнопку и проверьте ее цвет. Не очень элегантно, заметьте.

person Nuoji    schedule 16.02.2011
comment
@Nuoji: тот, который мне нужен, не задокументирован в UIButton.h или UIColor. Итак, ответ - нет, используйте арифметику. - person Seva Alekseyev; 16.02.2011
comment
Да, при игре с Какао есть место для множества вспомогательных функций / категорий. Я подозреваю, что цвет с плавающей запятой 0-1.0 вдохновлен OpenGL и т.п. - person Nuoji; 17.02.2011
comment
P.S. Добавлен хакерский способ получить стандартный цвет. Этот подход, очевидно, работает и для других компонентов, но очень уродлив ... - person Nuoji; 17.02.2011
comment
В iOS используются цвета с плавающей запятой, поскольку они унаследованы от Mac, где использование с плавающей запятой позволяет ОС абстрагироваться от деталей представления цвета и минимизировать ошибки, которые неизбежно возникают при переключении между цветовыми пространствами или смешивании 2+ цветов. вместе. Это очень задумано. - person Jonathan Grynspan; 17.02.2011
comment
Категория над UIColor - излишество, ИМХО. Вместо этого я бы сделал что-нибудь вроде #define RGB(r,g,b) ([UIColor colorWithRed:(r)/255. green:(g)/255. blue:(b)/255.]). Это дает преимущество вычислений во время компиляции при использовании с постоянными значениями RGB. - person Seva Alekseyev; 17.02.2011
comment
Что ж, вы можете написать эти категории как встроенные функции или определения. Просто он выглядит очень совместимым с обычным API UIColor. Обычно вы пишете [UIColor color..., а затем код завершаете. Если у вас есть категория, вы получите метод категории в качестве предложения, в противном случае вам нужно помнить, что вы назвали его RGB или аналогичным. Я бы предположил, что было бы крайне редко создавать новые цвета так часто, что дополнительное косвенное указание категории имеет значение. - person Nuoji; 18.02.2011

Если вам нужен цвет текста кнопки по умолчанию, все, что вам нужно сделать, это:

label.textColor = [button titleColorForState: UIControlStateNormal];

Вы можете получить другие цвета, указав другой UIControlState.

person Thick_propheT    schedule 15.10.2012
comment
Это при условии, что у меня в первую очередь есть кнопка. Извините, это не то, что мне нужно. - person Seva Alekseyev; 16.10.2012
comment
Когда я использовал его, я просто сделал временную кнопку, чтобы получить цвет, а затем избавился от нее, когда закончил. - person Thick_propheT; 16.10.2012
comment
@SevaAlekseyev Я знаю, что это было некоторое время назад, но я снова столкнулся с этим и заметил следующее: что-нибудь более элегантное, чем это? Если ваша цель - элегантность, возможно, вам придется переключиться на другой язык lul - person Thick_propheT; 10.12.2013