代码之家  ›  专栏  ›  技术社区  ›  mobibob

如何定义uicolor的常量值?

  •  59
  • mobibob  · 技术社区  · 14 年前

    我想做这样的事情,但是我不能得到一个合作的语法。

    static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
    

    我想我可以定义宏,但它们很难看。

    9 回复  |  直到 8 年前
        1
  •  124
  •   jasoncrawford    14 年前

    我喜欢使用类别为这类事情使用新方法来扩展类。以下是我今天刚写的代码的摘录:

    @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;
    }
    

    你也可以让一个宏来做记忆。

        2
  •  35
  •   Daniel Rinser    13 年前

    我通常为每个项目创建一个uicolor类别:

    @interface UIColor (ProjectName)
    
    +(UIColor *) colorForSomeTable;
    +(UIColor *) colorForSomeControl;
    +(UIColor *) colorForSomeText;
    
    @end
    

    使用实现中的常量:

    @implementation UIColor (ProjectName)
    
    +(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }
    
    @end
    

    我也会根据需要对uifont和uiimage执行相同的操作。

        3
  •  11
  •   JeremyP    14 年前

    如果您想预先计算这些值(或者只执行一次),可以扩展JasonCrawford的答案(我把它作为注释放进去,但是您不能在注释中格式化代码)。

    + (UIColor *)paleYellowColor
    {
        static UIColor* paleYellow = nil;
        if (paleYellow == nil)
        {
            paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
        }
        return paleYellow;
    }
    

    您最初的想法不起作用的原因是编译器只能在函数之外使用初始化器,而不能使用普通代码。你可以用初始化方法实现你想要的东西,例如

    static UIColor* colorNavBar = nil;
    
    +(void) initialize
    {
        if (colorNavBar != nil)
        {
            colorNavBar = ....
        }
    }
    

    const 原始定义上的限定符是多余的,因为 UIColor 无论如何都是不变的。

        4
  •  11
  •   petrichor    11 年前

    您可以像这样“定义”一个类似的常量:

    #define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9]
    

    并用你习惯于常数的名字来命名它: FAV_COLOR

    希望有帮助。

        5
  •  8
  •   intropedro    13 年前

    您可以这样做:

    #define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
    
        6
  •  5
  •   selva    9 年前

    在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()。

        7
  •  4
  •   Rinju Jain    10 年前
    #define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
    
    myLabel.textColor=textColorApp;
    
        8
  •  1
  •   Hardik Thakkar    9 年前

    只需在常量文件中定义下面的宏,只传递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)];
    
        9
  •  0
  •   Jul3ia    8 年前

    我觉得这也值得一提的另一个令人敬畏的功能,很少被谈论:彩色文字。它们不仅更容易阅读,而且更容易编辑。在斯威夫特,

    let color: UIColor = #colorLiteral(red: 0.9607843137, green: 0.4784313725, blue: 0.3215686275, alpha: 
    

    当粘贴到Xcode中时,此语法创建一个简单的颜色框。 Click here to see an example.

    一旦你看到这个框,你就可以双击它来轻松地编辑它。同样,您可以在各种IB选项之间切换,包括 RGB Sliders ,如果您有来自设计器的特定颜色十六进制值列表。