IOS:UIColor_使用十六进制数字或字符串实现自定义的颜色

引言

UIColor为我们提供了很多系统定义的颜色,比如:[UIColor redColor]、[UIColor blueColor] ......这样; 但是在项目中我们经常需要根据用户需求使用一些自定义的颜色,UI在给出这些颜色的时候大致分为以下几种类型:

  1. (R, G, B)= (255, 106, 80);
  2. 0xff6a50这样的十六进制数字。
  3. “#ff6a50”这样的字符串。(有的人也可能将0xff6a50作为字符串来使用)

本文会对以上三种形式的值怎样实现自定义颜色进行详细说明。

一、解决方法

  1. 针对引言中1、2 这样的形式,由于他们传递的值都是数值,所以有两种解决办法:
    a. 通过定义宏来实现,这样的优点是代码量较少。
    b. 通过调用方法+ (UIColor*)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 但是需要注意的一点是对于0xff6a50这样的十六进制数 字 我们需要进行处理,将它转化为RGB的值再调用该方法。
  2. 针对引言中3 ”0xff6a50“ 或者 ”#ff6a50“ 这样的字符串形式,本文主要通过代码来转换字符串为合理的RGB值,之后才能实现自定义颜色。

首先看一下还没有改变button背景色为自定义颜色前的初始界面,点击button,button的背景色变为0xff6a50这样的自定义颜色。

1.初始界面

接下来介绍具体实现方式。

二、具体实现方式

  1. 通过定义宏来实现自定义颜色(对应上文解决方法中的1.a)
    核心代码:
#define RGBACOLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:A]
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

点击界面中的第一部分的button1调用定义好的宏的方式:

- (IBAction)macroChangeCustomColor:(id)sender {
    UIButton *button = (UIButton *)sender;
    //button.backgroundColor = RGBACOLOR(255, 106, 80, 1);
    button.backgroundColor = UIColorFromRGB(0xff6a50);
}
  1. 通过代码来实现自定义颜色(对应上文解决方法中的1.b)
    代码实现:
- (IBAction)colorWithHex:(id)sender {
    UIButton *button = (UIButton *)sender;
    button.backgroundColor = [self colorWithHex:0xff6a50 alpha:1.0];
}

- (UIColor *)colorWithHex:(NSInteger)hex alpha:(CGFloat)alpha {
    return [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16))/255.0 green:((float)((hex & 0xFF00) >> 8))/255.0 blue:((float)(hex & 0xFF))/255.0 alpha:alpha];
}
  1. 通过代码将”0xff6a50“ 或者 ”#ff6a50“ 这样的字符串形式值,实现为自定义的颜色。(对应上文解决方法中的2)
    代码实现:
- (IBAction)colorWithHexString:(id)sender {
    UIButton *button = (UIButton *)sender;
    //button.backgroundColor = [self colorWithHexString:@"0xff6a50" alpha:1.0];
    button.backgroundColor = [self colorWithHexString:@"#ff6a50" alpha:1.0];
}

- (UIColor *)colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha {
    hexString = [hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    hexString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
    hexString = [hexString stringByReplacingOccurrencesOfString:@"0x" withString:@""];
    NSRegularExpression *RegEx = [NSRegularExpression regularExpressionWithPattern:@"^[a-fA-F|0-9]{6}$" options:0 error:nil];
    NSUInteger match = [RegEx numberOfMatchesInString:hexString options:NSMatchingReportCompletion range:NSMakeRange(0, hexString.length)];

    if (match == 0) {return [UIColor clearColor];}

    NSString *rString = [hexString substringWithRange:NSMakeRange(0, 2)];
    NSString *gString = [hexString substringWithRange:NSMakeRange(2, 2)];
    NSString *bString = [hexString substringWithRange:NSMakeRange(4, 2)];
    unsigned int r, g, b;
    BOOL rValue = [[NSScanner scannerWithString:rString] scanHexInt:&r];
    BOOL gValue = [[NSScanner scannerWithString:gString] scanHexInt:&g];
    BOOL bValue = [[NSScanner scannerWithString:bString] scanHexInt:&b];
    
    if (rValue && gValue && bValue) {
        return [UIColor colorWithRed:((float)r/255.0f) green:((float)g/255.0f) blue:((float)b/255.0f) alpha:alpha];
    } else {
        return [UIColor clearColor];
    }
}

通过这三种方式基本上可以搞定自定义颜色的实现了!最后看点击三个按钮后的效果图。

三、效果图

2. 效果图
关注我的微信公众号:“豆沙包小姐”!一个喜欢阅读,喜欢写字的女孩子,希望我的文字你能喜欢!谢谢你那么好看还能看我的文章到末尾处,祝陌生的你一切都好!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,595评论 4 59
  • -01- 后来,杜伽禹宠溺地看着我,"如果当时我没有认出你,我们该怎么办呢?" 我得意地笑起来,"像我这么聪明,你...
    _红豆阅读 5,756评论 104 174