美文网首页iOS学习交流iOS高质量博客
UIColor和十六进制颜色值得互相转换(包括透明度)

UIColor和十六进制颜色值得互相转换(包括透明度)

作者: LeeCoder | 来源:发表于2018-06-04 14:17 被阅读288次

    在开发中美工进行标注都是十六进制的颜色值,很少直接写具体的颜色值,有时出现的具体的颜色值也是已经规定好的十六进制的颜色值;十六进制一般以#开头,也有0x开头的,后面的才是真正的颜色值,一般都是6位数字或者字母或者两者的混合,也有8位的,这种是带有透明度的,8位的前两位就是透明度。

    透明度参照表:
    0%=FF(不透明)    5%=F2    10%=E5    15%=D8    20%=CC    25%=BF    30%=B2    35%=A5    40%=99    45%=8c    50%=7F   
    55%=72    60%=66    65%=59    70%=4c    75%=3F    80%=33    85%=21    90%=19    95%=0c    100%=00(全透明)
    
    要想把美工标注的颜色值显示出来必须转成UIColor,我们一般把转换方法封装起来:
    //如果hexString是8位则参数alpha失效,使用hexString包含的alpha
    + (UIColor *)colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha {
        //去除空格
        NSString *cString = [[hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
        //把开头截取
        if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];
        if ([cString hasPrefix:@"#"]) cString = [cString substringFromIndex:1];
        //6位或8位(带透明度)
        if ([cString length] < 6) {
            return nil;
        }
        //取出透明度、红、绿、蓝
        unsigned int a, r, g, b;
        NSRange range;
        range.location = 0;
        range.length = 2;
        if (cString.length == 8) {
            //a
            NSString *aString = [cString substringWithRange:range];
            //r
            range.location = 2;
            NSString *rString = [cString substringWithRange:range];
            //g
            range.location = 4;
            NSString *gString = [cString substringWithRange:range];
            //b
            range.location = 6;
            NSString *bString = [cString substringWithRange:range];
            
            [[NSScanner scannerWithString:aString] scanHexInt:&a];
            [[NSScanner scannerWithString:rString] scanHexInt:&r];
            [[NSScanner scannerWithString:gString] scanHexInt:&g];
            [[NSScanner scannerWithString:bString] scanHexInt:&b];
            
            return [UIColor colorWithRed:(r / 255.0f) green:(g / 255.0f) blue:(b / 255.0f) alpha:(a / 255.0f)];
        } else {
            //r
            NSString *rString = [cString substringWithRange:range];
            //g
            range.location = 2;
            NSString *gString = [cString substringWithRange:range];
            //b
            range.location = 4;
            NSString *bString = [cString substringWithRange:range];
            
            [[NSScanner scannerWithString:rString] scanHexInt:&r];
            [[NSScanner scannerWithString:gString] scanHexInt:&g];
            [[NSScanner scannerWithString:bString] scanHexInt:&b];
            
            return [UIColor colorWithRed:(r / 255.0f) green:(g / 255.0f) blue:(b / 255.0f) alpha:alpha];
        }
    }
    
    下面的方法是把UIColor转换成十六进制颜色值:
    - (NSString *)hexString {
        //颜色值个数,rgb和alpha
        NSInteger cpts = CGColorGetNumberOfComponents(self.CGColor);
        const CGFloat *components = CGColorGetComponents(self.CGColor);
        CGFloat r = components[0];//红色
        CGFloat g = components[1];//绿色
        CGFloat b = components[2];//蓝色
        if (cpts == 4) {
            CGFloat a = components[3];//透明度
            return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX", lroundf(a * 255), lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)];
        } else {
            return [NSString stringWithFormat:@"#%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)];
        }
    }
    

    相关文章

      网友评论

      • 心里有个数:刚好用上,不过我测试了一下,我们这边是最后两位是透明度!前面分别为rgb,与你文章中写的顺序不一致!
        LeeCoder:标准的十六进制颜色值顺序就是透明色-红-绿-蓝。这个没有硬性的规定,你可以根据实际情况进行解析

      本文标题:UIColor和十六进制颜色值得互相转换(包括透明度)

      本文链接:https://www.haomeiwen.com/subject/qyaesftx.html