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

2018.9.19

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

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

#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位長度字符串 和 不帶透明度的6位字符串,代碼掃一眼就明白了实苞;嗯豺撑,方便起見建議寫入U(xiǎn)IColor的分類中;

+ (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)換完畢的字符串不含任何前綴猾浦,如有需要陆错,請自行拼接0x,# 等慣用前綴金赦;另音瓷,HasAlpha參數(shù)決定是否將傳入U(xiǎn)IColor的透明度也計(jì)算入結(jié)果字符串,同樣的夹抗,掃一眼代碼就明白了绳慎;嗯,方便起見建議寫入U(xiǎn)IColor的分類中;

+ (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];
}


最后來個(gè)簡單示例
- (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)容合作請聯(lián)系作者
  • 序言:七十年代末偷线,一起剝皮案震驚了整個(gè)濱河市磨确,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌声邦,老刑警劉巖乏奥,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亥曹,居然都是意外死亡邓了,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門媳瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骗炉,“玉大人,你說我怎么就攤上這事蛇受【淇” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵兢仰,是天一觀的道長乍丈。 經(jīng)常有香客問我,道長把将,這世上最難降的妖魔是什么轻专? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮察蹲,結(jié)果婚禮上请垛,老公的妹妹穿的比我還像新娘。我一直安慰自己洽议,他們只是感情好宗收,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绞铃,像睡著了一般镜雨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儿捧,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音挑宠,去河邊找鬼菲盾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛各淀,可吹牛的內(nèi)容都是我干的懒鉴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼临谱!你這毒婦竟也來了璃俗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悉默,失蹤者是張志新(化名)和其女友劉穎城豁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抄课,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唱星,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跟磨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片间聊。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抵拘,靈堂內(nèi)的尸體忽然破棺而出哎榴,到底是詐尸還是另有隱情,我是刑警寧澤僵蛛,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布尚蝌,位于F島的核電站,受9級(jí)特大地震影響墩瞳,放射性物質(zhì)發(fā)生泄漏驼壶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一喉酌、第九天 我趴在偏房一處隱蔽的房頂上張望热凹。 院中可真熱鬧,春花似錦泪电、人聲如沸般妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碟渺。三九已至,卻和暖如春突诬,著一層夾襖步出監(jiān)牢的瞬間苫拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工旺隙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绒极,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓蔬捷,卻偏偏與公主長得像垄提,于是被迫代替她去往敵國和親榔袋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

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