我的头文件中有这个宏:
#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];
哪一种方法更好?
答案 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
...