iOS Tips #2 16進数でUIColorを生成する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOSの色指定ってよくわかりません。Webあがりの私にとっては16進数で指定したいです。いつも16進数で色探して、そんでiOS用に変換して...ととても面倒です。

// #FF0000(ま、これなら[UIColor redColor]でいいんですが)
[UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

というわけで、16進数で指定できるようUIColorのカテゴリーを定義しておきましょう。私の場合、UIColor+Hex.h、UIColor+Hex.mを定義して毎度使い回しています。以下、UIColor+Hex.h、UIColor+Hex.mを記載しておきます。

UIColor+Hex.h

#import <UIKit/UIKit.h>

/**
 16進数指定でUIColorを生成する。
 */
@interface UIColor (Hex)

/**
 16進数で指定されたRGBでインスタンスを生成する
 
 @param     colorCode  RGB
 @return    UIColorインスタンス
 */
+ (UIColor *)colorWithHex:(NSString *)colorCode;

/**
 16進数で指定されたRGBとAlpha値でインスタンスを生成する
 
 @param     colorCode   RGB
 @param     alpha       Alpha値
 @return    UIColorインスタンス
 */
+ (UIColor *)colorWithHex:(NSString *)colorCode alpha:(CGFloat)alpha;

@end

UIColor+Hex.m

#import "UIColor+Hex.h"

@implementation UIColor (Hex)

+ (UIColor *)colorWithHex:(NSString *)colorCode
{
    return [UIColor colorWithHex:colorCode alpha:1.0];
}

+ (UIColor *)colorWithHex:(NSString *)colorCode alpha:(CGFloat)alpha
{
    if ([[colorCode substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"#"]) {
        colorCode = [colorCode substringWithRange:NSMakeRange(1, colorCode.length - 1)];
    }
    
    if ([colorCode length] == 3) {
        NSMutableString *_colorCode = [[NSMutableString alloc] init];
        
        for (NSInteger i = 0; i < colorCode.length; i++) {
            [_colorCode appendString:[colorCode substringWithRange:NSMakeRange(i, 1)]];
            [_colorCode appendString:[colorCode substringWithRange:NSMakeRange(i, 1)]];
        }

        colorCode = [_colorCode copy];
    }
    
    NSString *hexCodeStr;
    const char *hexCode;
    char *endptr;
    CGFloat red, green, blue;
    
    for (NSInteger i = 0; i < 3; i++) {
        hexCodeStr = [NSString stringWithFormat:@"+0x%@", [colorCode substringWithRange:NSMakeRange(i * 2, 2)]];
        hexCode    = [hexCodeStr cStringUsingEncoding:NSASCIIStringEncoding];
        
        switch (i) {
            case 0:
                red   = strtol(hexCode, &endptr, 16);
                break;
                
            case 1:
                green = strtol(hexCode, &endptr, 16);
                break;
                
            case 2:
                blue  = strtol(hexCode, &endptr, 16);
                
            default:
                break;
        }
    }
    
    return [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:alpha];
}

@end
[/c]

<p>
これは以下のように使います。
</p>


#import "UIColor+Hex.h"

・・・

UIColor *color = [UIColor colorWithHex:@"FF0000"];
// 先頭に「#」があっても大丈夫!
UIColor *color = [UIColor colorWithHex:@"#FF0000"];

いつも思うんですが、カテゴリーってへんな感じですよね。直感的にはC#で言うpartialの方がわかりやすい気がします。

以上、短いですが、UIColorのTipsでした!