Подтвердить что ты не робот

Почему яркость [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;

Он отлично работает для любого цвета, но он производит черный цвет от белого цвета. (Хотя я ожидал бы серый цвет).

4b9b3361

Ответ 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