2009-08-07 12 views
5

ho questa macro nel mio file di intestazione:La macro è migliore di UIColor per l'impostazione del colore RGB?

#define UIColorFromRGB(rgbValue) \ 
     [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \ 
         green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ 
         blue:((float)(rgbValue & 0xFF))/255.0 \ 
         alpha:1.0]

e sto usando questo come qualcosa di simile nel mio file .m:

cell.textColor = UIColorFromRGB(0x663333);

Quindi voglio chiedere a tutti è meglio questo o dovrei usare questo approccio:

cell.textColor = [UIColor colorWithRed:66/255.0 
           green:33/255.0 
            blue:33/255.0 
           alpha:1.0];

Quale è l'approccio migliore?

+0

disimballaggio un NSInte ger come questo è specifico per l'architettura. Potresti considerare di fare in modo che UIColorFromRGB prenda 3 argomenti, ma questo tipo di sconfigge il tuo scopo. –

risposta

12

Una via di mezzo potrebbe essere la soluzione migliore. Si potrebbe definire sia una funzione obiettivo-C regolare C o di fare ciò che la macro sta facendo ora:

// As a C function: 
UIColor* UIColorFromRGB(NSInteger rgbValue) { 
    return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 
          green:((float)((rgbValue & 0xFF00) >> 8))/255.0 
          blue:((float)(rgbValue & 0xFF))/255.0 
          alpha:1.0]; 
} 

// As an Objective-C function: 
- (UIColor *)UIColorFromRGB:(NSInteger)rgbValue { 
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 
         green:((float)((rgbValue & 0xFF00) >> 8))/255.0 
         blue:((float)(rgbValue & 0xFF))/255.0 
         alpha:1.0]; 
}

Se si decide di attaccare con la macro, però, si dovrebbe mettere tra parentesi rgbValue laddove appare. Se decido di chiamare la tua macro con:

UIColorFromRGB(0xFF0000 + 0x00CC00 + 0x000099);

potresti incontrare problemi.

L'ultimo bit di codice è sicuramente il più leggibile, ma probabilmente il meno portatile - non è possibile chiamarlo semplicemente da qualsiasi punto del programma.

Tutto sommato, suggerirei di refactoring la tua macro in una funzione e lasciandola per quello.

0

I.m.h.o il metodo UIcolor è più leggibile. Penso che le macro siano grandi se risolvono un problema; cioè fornire più prestazioni e/o codice leggibile.

Non mi è chiaro quale sia il vantaggio di utilizzare una macro in questo caso, quindi preferirei la seconda opzione.

+0

ma come faccio a passare questo valore di colore sicuro web 33CC00 nel metodo colorwithrgb –

1

In genere consiglio le funzioni anziché i #defini complessi. Se l'inlining ha un vantaggio reale, il compilatore lo farà generalmente per te. #definisce rendere difficile il debug, in particolare quando sono complessi (e questo è).

Ma non c'è niente di sbagliato nell'usare una funzione qui. L'unico nocciolino che potrei dire è che dovresti usare CGFloat piuttosto che fluttuare, ma non c'è nulla di sbagliato nella notazione esadecimale se è più comodo per te. Se ne hai molti, posso vedere dove usare la notazione dei colori Web può essere conveniente. Ma evita le macro.

+0

ma come faccio a passare questo valore di colore sicuro per il web nel metodo colorwithrgb 33CC00 –

+0

Precisamente come con la macro, passando "0x33CC00". Questo è un numero intero legale, quindi puoi passarlo come parametro. –

+0

come faccio a passarlo in [UIColor colorWithRed: 66/255,0 verde: 33/255,0 blu: 33/255,0 alfa: 1,0]; questo metodo –

0

Ricordare che 33! = 0x33. Il primo è la notazione decimale e il secondo è esadecimale. Sono entrambi validi, ma sono diversi. La seconda opzione dovrebbe leggere

cell.textColor = [UIColor colorWithRed:0x66/255.0 
          green:0x33/255.0 
           blue:0x33/255.0 
          alpha:1.0]; 

o

cell.textColor = [UIColor colorWithRed:102/255.0 
          green:51/255.0 
           blue:51/255.0 
          alpha:1.0]; 
15

ne dite di creare la propria:

#define RGB(r, g, b) \ 
    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1] 
#define RGBA(r, g, b, a) \ 
    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)] 

quindi utilizzarlo:

cell.textColor = RGB(0x66, 0x33, 0x33); 

sembra abbastanza semplice da usare, usa valori esadecimali per colori e arguzia che necessita di un overhead di calcolo aggiuntivo.

0

Nizza Marius, ma per la compilazione ho dovuto sbarazzarsi della parentesi, come segue (in caso contrario, Objective C lo prende alla lettera e si ottiene un errore di compilazione sintassi:

#define RGB(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0] 
... 

NSArray *palette; 
... 

palette = [NSArray arrayWithObjects: 
      RGB(0,0,0), 
      RGB(255,0,0), // red 
... 
+0

La parentesi era in realtà piuttosto importante, lasciandolo fuori avrebbe dovuto restituire valori come 'RGB (100 + 100, 255, 255)' erroneamente a causa degli effetti secondari di sostituzione delle macro. (Red rould hanno il valore: 100 + 100/255.0 = 100.4) – Marius

17

o creare una categoria a parte, in modo che solo bisogno di importare un file di .h:

@interface UIColor (util) 
+ (UIColor *) colorWithHexString:(NSString *)hex; 
+ (UIColor *) colorWithHexValue: (NSInteger) hex; 
@end 

e

#import "UIColor-util.h" 

@implementation UIColor (util) 

// Create a color using a string with a webcolor 
// ex. [UIColor colorWithHexString:@"#03047F"] 
+ (UIColor *) colorWithHexString:(NSString *)hexstr { 
    NSScanner *scanner; 
    unsigned int rgbval; 

    scanner = [NSScanner scannerWithString: hexstr]; 
    [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]]; 
    [scanner scanHexInt: &rgbval]; 

    return [UIColor colorWithHexValue: rgbval]; 
} 

// Create a color using a hex RGB value 
// ex. [UIColor colorWithHexValue: 0x03047F] 
+ (UIColor *) colorWithHexValue: (NSInteger) rgbValue { 
    return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 
          green:((float)((rgbValue & 0xFF00) >> 8))/255.0 
          blue:((float)(rgbValue & 0xFF))/255.0 
          alpha:1.0]; 

} 


@end 
+0

questo ha bisogno di più upvotes –

Problemi correlati