2009-08-07 102 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