Почему яркость [UIColor whiteColor] и blackColor равны
Позвольте мне показать вам некоторые результаты получения оттенка, насыщенности и яркости трех UIColors.
[[UIColor redColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 1.0 saturatino = 1.0 brightness = 1.0 alpha = 0.0
[[UIColor whiteColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
[[UIColor blackColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
Может ли кто-нибудь объяснить, почему оттенок, насыщенность, яркость белого и черного цветов равны? Почему альфа равна нулю?
Что я хотел сделать в своем проекте, так это сгенерировать "темный" цвет от заданного цвета, изменив его яркость:
яркость = яркость * 0,8;
Он отлично работает для любого цвета, но он производит черный цвет от белого цвета. (Хотя я ожидал бы серый цвет).
Ответы
Ответ 1
Причина в том, что +whiteColor
и +blackColor
возвращают цвета в цветовом пространстве оттенков серого, что несовместимо с цветовым пространством HSB. Таким образом, -getHue:saturation:brightness:alpha:
фактически не изменяет параметры. Я думаю, вы обнаружите, что все они настроены на 0.0
перед вызовом этого метода. Если вы проверите возвращаемое значение -getHue:saturation:brightness:alpha:
, оно сообщит вам, успешно ли оно преобразовано в HSB.
Ответ 2
Кевин Баллард выше дал вам правильный ответ о причине проблемы. У меня есть аналогичное требование в приложении, над которым я работаю, кроме того, что мне также хотелось бы динамически модифицировать альфа цвета. Для этого я создал категорию (UIColor + Modify) одним способом в ней (см. Код ниже). Реализация предполагает, что если цвет отсутствует в пространстве RGB/HSB, вы ищете оттенок белого. Вы должны легко адаптировать это для "умножения" яркости.
#import "UIColor+Modify.h"
@implementation UIColor (Modify)
-(UIColor*)setBrightness:(CGFloat)brightness alpha:(CGFloat)alpha {
CGFloat hue = 0.0F;
CGFloat saturation = 0.0F;
[self getHue:&hue saturation:&saturation brightness:nil alpha:nil])
// if the above fails then hue and saturation will still be 0.0F
// according to Apple documentation <1>
return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha];
}
@end
Затем я использую этот метод, когда хочу изменить другую яркость цвета и альфа:
#import "UIColor+Modify.h"
...
UIColor brightColor = [UIColor redColor];
UIColor lessBrightSeeThroughColor = [someColor setBrightness:0.9F alpha 0.8F];
....
< 1 > Документация UIColor