5

我的头文件中有这个宏:

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

哪个是更好的方法?

4

7 回答 7

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
于 2011-09-09T16:16:31.493 回答
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);

使用起来似乎很简单,使用十六进制值作为颜色,不需要额外的计算开销。

于 2010-11-03T20:41:36.007 回答
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);

你可能会遇到麻烦。

最后一段代码当然是最易读的,但可能是最不便携的——你不能简单地从程序中的任何地方调用它。

总而言之,我建议将您的宏重构为一个函数并保留它。

于 2009-08-07T06:48:14.300 回答
1

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

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

于 2009-08-07T06:48:55.207 回答
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];
于 2009-08-07T12:07:58.570 回答
0

恕我直言 UIcolor 方法更具可读性。我认为如果宏解决了问题,它们就很棒;即提供更多性能和/或可读代码。

我不清楚在这种情况下使用宏有什么好处,所以我更喜欢第二种选择。

于 2009-08-07T06:47:17.813 回答
0

不错的 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
...
于 2011-01-13T05:28:23.203 回答