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. 效果图
关注我的微信公众号:“豆沙包小姐”!一个喜欢阅读,喜欢写字的女孩子,希望我的文字你能喜欢!谢谢你那么好看还能看我的文章到末尾处,祝陌生的你一切都好!

推荐阅读更多精彩内容

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