我想做类似于这样的事情,但我无法得到合作的语法。
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
我想我可以定义宏,但它们很丑。
我想做类似于这样的事情,但我无法得到合作的语法。
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
我想我可以定义宏,但它们很丑。
我喜欢使用类别(category)来为类增加新方法,针对这种情况非常有效。以下是我今天刚写的一段代码摘录:
@implementation UIColor (Extensions)
+ (UIColor *)colorWithHueDegrees:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness {
return [UIColor colorWithHue:(hue/360) saturation:saturation brightness:brightness alpha:1.0];
}
+ (UIColor *)aquaColor {
return [UIColor colorWithHueDegrees:210 saturation:1.0 brightness:1.0];
}
+ (UIColor *)paleYellowColor {
return [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
}
@end
现在我可以在代码中做这样的事情:
self.view.backgroundColor = highlight? [UIColor paleYellowColor] : [UIColor whitecolor];
我的自定义颜色可以与系统定义的颜色完美地融合在一起。
(顺便提一句,随着我对颜色的关注度越来越高,我开始更多地从HSB角度思考,而不是RGB。)
关于预计算值的更新: 我的直觉是这样做不值得。但如果你真的想要,你可以用静态变量来缓存这些值:
+ (UIColor *)paleYellowColor {
static UIColor *color = nil;
if (!color) color = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
return color;
}
你也可以使用宏来进行记忆化。
#import
@interface UIColor ()
+ (UIColor *)aquaColor;
@end
要使用它,请导入UIColor_MyColors.h文件:#import "UIColor_MyColors.h"
并像这样引用颜色:[self.view setBackgroundColor:[UIColor aquaColor]];
- drpawelo+ (UIColor *)colorWithWebRed:(CGFloat)red Green:(CGFloat)green Blue:(CGFloat)blue { return [UIColor colorWithRed:red/255 green:green/255 blue:blue/255 alpha:1.0]; }
并像这样使用它:+ (UIColor *)aquaColor { return [UIColor colorWithWebRed:59 Green:89 Blue:152]; }
- drpawelo我通常为每个项目创建一个UIColor类别:
@interface UIColor (ProjectName)
+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;
@end
使用实现中的常量:
@implementation UIColor (ProjectName)
+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }
@end
我也会根据需要对UIFont和UIImage执行相同的操作。
为了进一步说明jasoncrawford的回答(我会在评论中加入,但你不能在评论中格式化代码),如果你想要预先计算这些值(或者只计算一次)。
+ (UIColor *)paleYellowColor
{
static UIColor* paleYellow = nil;
if (paleYellow == nil)
{
paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
}
return paleYellow;
}
你原本的想法不能正常工作的原因是,编译器只能在函数外使用初始化器,而不能在普通代码中使用。你可以通过initialize方法实现类似于所需功能的效果。static UIColor* colorNavBar = nil;
+(void) initialize
{
if (colorNavBar != nil)
{
colorNavBar = ....
}
}
注意,您原始定义中的const
限定词是多余的,因为UIColor
本身是不可变的。
您可以像此示例一样“定义”类似的常量:
#define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9]
你可以像使用常量一样,用名称来调用它:FAV_COLOR
。
希望这可以帮到你。
#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
在Swift中,定义一个扩展:
extension UIColor {
class func XXXWhiteColor() -> UIColor {
return UIColor(red: 256, green: 256, blue: 256, alpha: 1.0)
}
class func XXXGreenColor() -> UIColor {
return UIColor(red: 73/255.0, green: 212/255.0, blue: 86/255.0, alpha: 1.0)
}
}
使用方法:
label.background = UIColor.XXXWhiteColor()
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
myLabel.textColor=textColorApp;
只需在您的常量文件中定义以下宏,并传递仅RGB值,然后您可以在任何地方使用
#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
[lblCount setTextColor:RGBCOLOR(236, 43, 92)];
static UIColor *const color = ....
。只需将扩展名更改为*.mm
即可。 - Aleks N.