Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在设置RGB颜色时,宏是否优于UIColor?_Objective C_Iphone_Xcode_Macros_Uicolor - Fatal编程技术网

Objective c 在设置RGB颜色时,宏是否优于UIColor?

Objective c 在设置RGB颜色时,宏是否优于UIColor?,objective-c,iphone,xcode,macros,uicolor,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 & 0xF

我的头文件中有此宏:

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

哪个方法更好?

I.m.h.o UIcolor方法更具可读性。我认为宏观的是伟大的,如果他们解决了一个问题;i、 e.提供更高的性能和/或可读代码


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

中间立场可能是最好的选择。您可以定义常规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);
你可能会遇到麻烦

最后一段代码当然是可读性最好的,但可能是可移植性最差的——您不能简单地从程序中的任何地方调用它


总而言之,我建议将宏重构为函数,并将其保留下来。

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


但是在这里使用函数没有什么错。我唯一想说的是,你应该使用CGFloat而不是float,但是如果十六进制符号对你来说更合适的话,它没有什么错。如果你有很多这些,我可以看到在哪里使用网络颜色符号可能是方便的。但是要避免使用宏。

记住33!=0x33。第一种是十进制,第二种是十六进制。它们都是有效的,但它们是不同的。你的第二个选择应该是

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


如何创建自己的:

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

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

尼斯·马吕斯,但要编译,我必须去掉括号,如下所示(否则,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
...

或者创建一个单独的类别,因此您只需要导入一个.h文件:

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


解开这样的NStaskStudio是特定于架构的。您可以考虑让UICORORROFMRGB采取3个参数,但这种方式会破坏您的目标。但是,如何通过“0x33 cc00”,在GraceWiRGB方法33 cc00中传递这个Web安全的颜色值,就像宏一样。。这是一个法定整数,因此您可以将其作为参数传递。我如何在[UIColor COLOR WITHRED:66/255.0 green:33/255.0 blue:33/255.0 alpha:1.0]中传递它;此方法但如何在colorwithrgb方法中传递此web安全颜色值33CC00圆括号实际上非常重要,忽略它会由于宏替换的副作用而错误地渲染值,如
RGB(100+100255)
。(红色框的值为:100+100/255.0=100.4)
@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