Есть ли обычный метод для инвертирования значений NSColor?

Я ищу способ инвертировать произвольныйNSColor значения во время выполнения, и, кажется, нет встроенного метода для этого.

Я буду использовать категорию для расширенияNSColor следующее:

NSColor * invertedColor = [someOtherColor inverted];

Вот прототип метода категории, который я использую:

@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
    NSColor * original = [self colorUsingColorSpaceName:
                      NSCalibratedRGBColorSpace];
    return ...?
}
@end

Кто-нибудь может заполнить пробелы? Это не должно быть идеально, но я бы хотел, чтобы это имело смысл. т.е .:

[[[NSColor someColor] inverted] inverted] приведет к цвету очень близко к исходному цвету

[[NSColor whiteColor] inverted] было бы очень близко к[NSColor blackColor]

Перевернутые цвета будут на противоположных сторонахцветное колесо, (красный и зеленый, желтый и фиолетовый и т. д.)

Альфа-значение должно оставаться таким же, как оригиналNSColor, Я только хочу инвертироватьцвет, а не прозрачность.

ОБНОВЛЕНИЕ 3: (теперь в цвете!)

Оказывается, используядополнительный цвет (цвет с оттенком 180 ° от исходного оттенка) не вполне достаточен, поскольку белый и черный на самом деле не имеют значения оттенка. Начиная с ответа, предоставленногоФебвот что я придумал:

CGFloat hue = [original hueComponent];
if (hue >= 0.5) { hue -= 0.5; } else { hue += 0.5; }
return [NSColor colorWithCalibratedHue:hue
                            saturation:[original saturationComponent]
                            brightness:(1.0 - [original brightnessComponent])
                                 alpha:[original alphaComponent]];

Оттенок по-прежнему поворачивается на 180 °, но я также инвертирую компонент яркости, чтобы очень темные цвета стали очень яркими (и наоборот). Это относится к черно-белым случаям, но инвертирует практически каждый цвет в черный (что нарушает мое правило двойной инверсии). Вот результаты:

образец цвета # 1 http://img29.imageshack.us/img29/8548/invert1.jpg

В настоящее время,Подход Питера Хоси намного проще, и это дает лучшие результаты:

return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
                                 green:(1.0 - [original greenComponent])
                                  blue:(1.0 - [original blueComponent])
                                 alpha:[original alphaComponent]];

образец цвета # 2 http://img29.imageshack.us/img29/1513/invert2.jpg

в Swift 4.2:

extension NSColor {

    func inverted() -> NSColor? {
        return NSColor(calibratedRed: 1.0 - redComponent,
                               green: 1.0 - greenComponent,
                               blue: 1.0 - blueComponent,
                               alpha: alphaComponent)
    }
} 

Ответы на вопрос(3)

Ваш ответ на вопрос