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