2013-02-28 10 views
11

Lascia che ti mostri alcuni risultati di ottenere tonalità, saturazione e luminosità di tre UIColors.Perché la luminosità di [UIColor whiteColor] e blackColor sono uguali

[[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 

qualcuno può spiegare il motivo per cui tonalità, saturazione, luminosità del colore bianco e nero sono uguali? Perché alpha è uguale a zero?

Quello che volevo fare nel mio progetto è di generare il colore 'scuro' da un dato colore modificando lo luminosità:

luminosità = luminosità * 0.8;

Funziona bene per qualsiasi colore, ma produce colore nero dal colore bianco. (Anche se mi aspetterei un colore grigio).

+0

+1 grande cattura, mai provato questo. –

+0

'saturatino' suona cuterino :) –

risposta

12

Il motivo è perché +whiteColor e +blackColor restituiscono entrambi i colori nello spazio colori in scala di grigi, che non è compatibile con lo spazio cromatico HSB. In questo modo, -getHue:saturation:brightness:alpha: non modifica effettivamente i parametri. Penso che troverai che li hai tutti impostati su 0.0 prima di chiamare quel metodo. Se si controlla il valore restituito di -getHue:saturation:brightness:alpha:, verrà indicato se è stato correttamente convertito in HSB.

+0

+1 Incredibile !!! Non l'ho mai pensato. –

+0

Grazie! Quindi esiste un modo universale per generare colori più scuri da UIColor, anche se è in scala di grigi? Ci sono altre situazioni quando getHue: saturazione: luminosità: alfa: può restituire falso? – msmialko

+1

@Moriquendi: È possibile che anche altri spazi colori non siano convertibili in HSB, ma non so quanti spazi di colori è probabile che si incontrino nella programmazione iOS. Nel peggiore dei casi, è possibile creare un CGBitmapContext 1px-by-1px supportato dai propri dati, riempirlo con il colore di origine, riempirlo nuovamente con un nero per lo più trasparente, eliminare il contesto e leggere il buffer dei pixel per il nuovo colore . –

0

Kevin Ballard in alto ha fornito la risposta corretta sulla causa del problema. Ho un requisito simile in un'app a cui sto lavorando tranne che mi piacerebbe anche modificare dinamicamente l'alfa del colore. Per farlo ho creato una categoria (UIColor + Modify) con un metodo in esso (vedi il codice sotto). L'implementazione presuppone che se un colore non è nello spazio RGB/HSB, allora stai cercando una tonalità di bianco. Dovresti facilmente essere in grado di adattarlo per "moltiplicare" la luminosità.

#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's documentation <1> 

    return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; 
} 
@end 

Ho quindi utilizzare questo metodo quando voglio cambiare la luminosità e l'alfa di un altro colore:

#import "UIColor+Modify.h" 
... 
UIColor brightColor = [UIColor redColor]; 
UIColor lessBrightSeeThroughColor = [someColor setBrightness:0.9F alpha 0.8F]; 
.... 

< 1>UIColor documentation

Problemi correlati