宏定义在设置RGB颜色方面是否比UIColor更好?

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

哪种方法更好?

像这样解包 NSInteger 是与架构有关的。您可以考虑让 UIColorFromRGB 接受 3 个参数,但这有点违背了您的初衷。 - Jon Hess
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

14

你可以自己创建一个:

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

看起来很简单易用,使用十六进制值表示颜色,而无需额外的计算开销。


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);

你可能会遇到麻烦。

最后一段代码肯定是最可读的,但可能是最不可移植的 - 你不能在程序中的任何地方简单地调用它。

总之,我建议将你的宏重构为一个函数,就这样。


1

我通常建议使用函数而不是复杂的 #define。如果内联有真正的好处,编译器通常会为您执行它。#define 使调试变得困难,特别是当它们很复杂时(而这个确实很复杂)。

但在这里使用函数没有任何问题。唯一的小问题是你应该使用 CGFloat 而不是 float,但如果对你来说十六进制符号更舒适,那么也没有什么问题。如果你有很多这样的代码,我可以理解使用 Web 颜色符号可能更方便。但要避免使用宏。


但是,我该如何在“colorwithrgb”方法中传递这个 Web 安全颜色值 33CC00 呢? - Rahul Vyas
就像宏一样,通过传递“0x33CC00”。这是一个合法的整数,因此您可以将其作为参数传递。 - Rob Napier
如何在这个方法中传递颜色参数:[UIColor colorWithRed:66/255.0 green:33/255.0 blue:33/255.0 alpha:1.0]; - Rahul Vyas

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
...

括号实际上非常重要,如果省略它,由于宏替换的副作用,像 RGB(100+100, 255, 255) 这样的值会被错误地渲染。(红色将具有值:100 + 100/255.0 = 100.4) - Marius

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

0

在我看来,UIColor方法更易读。如果宏能解决问题,即提供更好的性能和/或可读性代码,那么宏是很棒的。

在这种情况下,我不清楚使用宏的优势是什么,因此我更喜欢第二个选项。


但是我怎样在colorwithrgb方法中传递这个网页安全颜色值33CC00? - Rahul Vyas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接