web-dev-qa-db-ja.com

UIColorの定数値を定義するにはどうすればよいですか?

このようなことをしたいのですが、協調的な構文を得ることができません。

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

マクロを定義できると思いますが、見苦しいです。

60
mobibob

この種の新しいメソッドを使用してクラスを拡張するために、カテゴリを使用するのが好きです。これが、今日書いたばかりのコードの抜粋です。

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

自分で定義した色は、システム定義の色とぴったり合っています。

(ちなみに、色に注意を払うにつれて、RGBよりもHSBの観点で考えるようになりました。)

値の事前計算に関する更新:私の考えでは、価値がないということです。ただし、本当に必要な場合は、静的変数を使用して値をメモできます。

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

マクロにメモ化を行わせることもできます。

124
jasoncrawford

通常、プロジェクトごとにUIColorのカテゴリを作成します。

@interface UIColor (ProjectName)

+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;

@end

実装の定数を使用する場合:

@implementation UIColor (ProjectName)

+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }

@end

必要に応じて、UIFontとUIImageについても同じことを行います。

35
drawnonward

次のような同様の定数を「定義」できます。

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

定数で慣れているように名前で呼び出します:FAV_COLOR

お役に立てば幸いです。

11
kasperfn

値を事前計算する(または一度だけ実行する)場合に、jasoncrawfordの答え(これをコメントとして入れますが、コメント内のコードをフォーマットすることはできません)を拡張するため。

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

元のアイデアが機能しないのは、コンパイラが関数以外の初期化子しか使用できず、通常のコードを使用できないためです。 initialize methosdで望みのようなものを達成できたかもしれません。

static UIColor* colorNavBar = nil;

+(void) initialize
{
    if (colorNavBar != nil)
    {
        colorNavBar = ....
    }
}

注意:constは不変であるため、元の定義のUIColor修飾子は冗長です。

11
JeremyP

あなたはこれを行うことができます:

#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
8
intropedro

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

5
selva
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]

myLabel.textColor=textColorApp;
4
Rinju Jain

以下のマクロを定数ファイルで定義し、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)];
1
Hardik Thakkar

また、めったに語られないもう1つのすばらしい機能、カラーリテラルについても言及する価値があると思います。読みやすいだけでなく、編集も非常に簡単です。 Swiftでは、

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

Xcodeに貼り付けると、この構文は単純なカラーボックスを作成します。 例を見るにはここをクリック

ボックスが表示されたら、ダブルクリックして簡単に編集できます。同様に、デザイナーから色の16進値の特定のリストがある場合は、 RGB Sliders を含むさまざまなIBオプションを切り替えることができます。

0
Jul3ia