Sto cercando un modo per invertire i valori arbitrari di NSColor in fase di esecuzione e non sembra esserci alcun metodo incorporato per farlo.Esiste un metodo convenzionale per invertire i valori NSColor?
userò una categoria di estendere NSColor
come segue:
NSColor * invertedColor = [someOtherColor inverted];
Ecco il metodo prototipo di categoria che sto usando:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
chiunque può riempire gli spazi vuoti? Questo non deve essere perfetto, ma mi piacerebbe che avesse un senso. cioè .:
[[[NSColor someColor] inverted] inverted]
determinerebbe un colore molto vicino al colore originale[[NSColor whiteColor] inverted]
sarebbe molto vicino a[NSColor blackColor]
colori invertiti sarebbe su lati opposti del color wheel. (Rosso & verde, giallo & viola, ecc)
Il valore alfa deve rimanere lo stesso dell'originale NSColor
. Sto solo cercando di invertire il colore, non la trasparenza.
UPDATE 3: (! Ora a colori)
Si scopre che utilizzando una (un colore con una tonalità di 180 ° di distanza dalla tonalità originale) complementary color non è abbastanza, in quanto bianco e il nero non ha davvero un valore di tonalità. Partendo dalla risposta fornita da phoebus, questo è ciò che è venuta:
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]];
la tonalità è ancora ruotata di 180 °, ma anche invertire la componente luminosità in modo che i colori molto scuri diventano molto luminoso (e viceversa). Questo si occupa dei casi in bianco e nero, ma inverte quasi ogni colore in nero (che viola la mia regola di doppia inversione). Ecco i risultati:
color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg
Ora, Peter Hosey's approach è molto più semplice, e produce risultati migliori:
return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
green:(1.0 - [original greenComponent])
blue:(1.0 - [original blueComponent])
alpha:[original alphaComponent]];
color swatch #2 http://img29.imageshack.us/img29/1513/invert2.jpg
Suvato per essere diretto su di esso :) – phoebus
Nota: per grigio = 0,5, 0,5, 0,5; complemento è se stesso. – Pang