(iOS - Objective-C) HexString & UIColor 互轉(zhuǎn)

2018.9.19

一個(gè)簡(jiǎn)單的宏定義

宏定義可以直接將16進(jìn)制的顏色值轉(zhuǎn)成對(duì)應(yīng)的UIColor對(duì)象;

#define UIColorFromRGBA(rgbValue, alpha) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:alpha]


HexString 轉(zhuǎn) UIColor

支持前綴 0x,# 標(biāo)識(shí),支持 帶透明度的8位長(zhǎng)度字符串 和 不帶透明度的6位字符串,代碼掃一眼就明白了;嗯,方便起見(jiàn)建議寫(xiě)入U(xiǎn)IColor的分類(lèi)中;

+ (UIColor *)ColorWithHexString:(NSString *)color {
    return [UIColor ColorwithHexString:color Alpha:-1];
}

自定義當(dāng)前轉(zhuǎn)換顏色的 透明度,若Alpha的值小于0,則表明放棄自定義透明度的操作;

+ (UIColor *)ColorwithHexString:(NSString *)color Alpha:(CGFloat)alpha {
    NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    // String should be 6 or 8 characters
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }

    // strip 0X if it appears
    if ([cString hasPrefix:@"0X"])
        cString = [cString substringFromIndex:2];
    if ([cString hasPrefix:@"#"])
        cString = [cString substringFromIndex:1];
    if ([cString length] != 8 && [cString length]!=6)
        return [UIColor clearColor];

    CGFloat insideAlpha = 1.0f;
    if ([cString length]==8) {
        NSString *aString = [cString substringWithRange:NSMakeRange(0, 2)];
        unsigned int a;
        [[NSScanner scannerWithString:aString] scanHexInt:&a];
        insideAlpha = (float)a / 255.0f;
        cString =  [cString substringWithRange:NSMakeRange(2, 6)];
    }
    if (alpha>0) {
        insideAlpha = alpha;
    }

    // Separate into r, g, b substrings
    NSRange range;
    range.location = 0;
    range.length = 2;

    //r
    NSString *rString = [cString substringWithRange:range];

    //g
    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    //b
    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    // Scan values
    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:insideAlpha];
}


UIColor 轉(zhuǎn) HexString

轉(zhuǎn)換完畢的字符串不含任何前綴,如有需要,請(qǐng)自行拼接0x,# 等慣用前綴;另,HasAlpha參數(shù)決定是否將傳入U(xiǎn)IColor的透明度也計(jì)算入結(jié)果字符串,同樣的,掃一眼代碼就明白了;嗯,方便起見(jiàn)建議寫(xiě)入U(xiǎn)IColor的分類(lèi)中;

+ (NSString *)HexStringWithColor:(UIColor *)color HasAlpha:(BOOL)hasAlpha {
    CGFloat r, g, b, a;
    [color getRed:&r green:&g blue:&b alpha:&a];
    int rgb = (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0;
    if (hasAlpha) {
        rgb = (int)(a * 255.0f)<<24 | (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0;
    }

    return [NSString stringWithFormat:@"%06x", rgb];
}


最后來(lái)個(gè)簡(jiǎn)單示例
- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *sampleView = [[UIView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:sampleView];
    //sampleView.backgroundColor = UIColorFromRGBA(0x00a47b, 1.0f);
    sampleView.backgroundColor = [UIColor ColorWithHexString:@"0x6700a47b"];
    NSString *sampleStr = [UIColor HexStringWithColor:sampleView.backgroundColor HasAlpha:YES ];
    NSLog(@"%@", sampleStr);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,715評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,665評(píng)論 1 32
  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí),c語(yǔ)言,java語(yǔ)言,單片機(jī)的匯編語(yǔ)言等;大學(xué)畢...
    oceanfive閱讀 3,395評(píng)論 0 7
  • 一、功力自測(cè) 以下每個(gè)問(wèn)題的評(píng)分區(qū)間均為0-10;根據(jù)自己的實(shí)際情況,可以做的十分好評(píng)分為10,完全做不好為0,請(qǐng)...
    燕子不飛么閱讀 245評(píng)論 0 0

友情鏈接更多精彩內(nèi)容