用于设置RGB颜色的宏比UIColor好吗?

时间:2009-08-07 06:26:18

标签: objective-c iphone xcode macros uicolor

我的头文件中有这个宏:

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

哪一种方法更好?

7 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);

看似简单易用,使用十六进制值进行颜色,无需额外的计算开销。

答案 2 :(得分:12)

中间地带可能是您的最佳选择。您可以定义常规C或Objective-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);
你可能会遇到麻烦。

最后一段代码当然是最具可读性的,但可能是最不便携的 - 你不能在程序的任何地方简单地调用它。

总而言之,我建议将宏重构为一个函数并将其保留在该函数中。

答案 3 :(得分:1)

我通常推荐函数而不是复杂的#defines。如果内联有一个真正的好处,编译器通常会为你做。 #defines使调试变得困难,特别是当它们很复杂时(而且这个是复杂的)。

但是在这里使用一个函数并没有错。我要说的唯一的挑剔是你应该使用CGFloat而不是浮动,但是如果它对你来说更舒适,那么十六进制符号没有任何问题。如果你有很多这些,我可以看到使用Web颜色表示法可能很方便。但是要避免使用宏。

答案 4 :(得分:0)

I.m.h.o UIcolor方法更具可读性。我认为如果解决问题,宏观会很棒;即提供更多性能和/或可读代码。

我不清楚在这种情况下使用宏的优点是什么,所以我更喜欢第二种选择。

答案 5 :(得分: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];

答案 6 :(得分:0)

Nice Marius,但要编译我必须摆脱括号,如下所示(否则,Objective 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
...