2009-08-07 103 views
5

我有這個宏在我的頭文件:宏是否比UIColor設置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]

,我使用這個作爲我的.m文件是這樣的:

cell.textColor = UIColorFromRGB(0x663333);

所以我要問大家這是好還是我應該使用這種方法:

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

哪一個是更好的方法?

+0

開箱的NSInte像這樣的ger是架構特定的。你可能會考慮讓UIColorFromRGB接受3個參數,但這種做法會挫敗你的目的。 – 2009-08-07 06:52:13

回答

12

中間地帶可能是您最好的選擇。你可以定義一個普通的C或目標C函數做您的宏現在是這樣做的:

// 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]; 
}

如果您決定堅持使用宏,但是,你應該把周圍rgbValue括號凡出現。如果我決定致電您的宏:

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

您可能會遇到麻煩。

的最後一段代碼肯定是最可讀的,但可能是最缺乏移植 - 簡單地從任何地方在你的程序,你不能把它。

總而言之,我建議您將宏重構爲一個函數,並將其留在那裏。

0

I.m.h.o UIcolor方法更具可讀性。我認爲,如果宏解決了一個問題,它是很棒的;即提供更多的性能和/或可讀代碼。

目前尚不清楚對我有什麼用宏的優點是在這種情況下,所以我更喜歡第二個選項。

+0

但我如何通過colorwithrgb方法 – 2009-08-07 07:21:20

1

我通常推薦使用函數而不是複雜的#defines。如果內聯有真正的好處,編譯器通常會爲你做。 #定義使調試變得困難,特別是當它們很複雜(而且這是一個)時。

但是在這裏使用函數沒有任何問題。我要說的唯一挑戰就是你應該使用CGFloat而不是浮點數,但是如果十六進制符號更舒適,那麼十六進制符號沒有什麼問題。如果你有很多這些,我可以看到在哪裏使用Web顏色符號可能會很方便。但避免宏。

+0

這個網頁安全顏色值33CC00但我如何通過colorwithrgb方法33CC00 – 2009-08-07 07:20:44

+0

這個web安全的顏色值正如與宏一樣,通過「0x33CC00」。這是一個合法的整數,所以你可以將它作爲參數傳遞。 – 2009-08-07 07:25:08

+0

我如何通過[UIColor colorWithRed:66/255.0 green:33/255.0 blue:33/255.0 alpha:1.0];此方法 – 2009-08-07 10:59:34

0

請記住,33!= 0x33。第一個是十進制符號,第二個是十六進制。他們都是有效的,但他們是不同的。你的第二個選項應該讀

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

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

如何創建自己:

#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)] 

然後使用它:

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

看起來非常簡單易用,顏色和機智使用十六進制值需要額外的計算開銷。

0

尼斯馬呂斯,但編譯我不得不擺脫括號,如下所示(否則,目標C字面上需要它,你會得到一個語法編譯錯誤:

#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

括號實際上非常重要,如果由於宏替換副作用而使其不能正確顯示'RGB(100 + 100,255,255)'等值。 (Red rould的值爲:100 + 100/255.0 = 100.4) – Marius 2016-01-26 22:06:58

17

或創建一個單獨的類別,所以你只需要輸入一個.h文件中:

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

#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

這需要更多的贊助人 – 2012-08-29 06:09:15