浅谈iOS颜色

来源:互联网 发布:java 方法重写有什么用 编辑:程序博客网 时间:2024/06/04 21:03

浅谈iOS颜色

1.简介

到深圳一个月了,虽说找工作不容易,但是终于找到了一份工作了,话不多说,好久没写博客了,今天我们来谈一谈颜色:
在iOS开发中,我们一般用两种方式来表示颜色:

第一种就是RGB了,举个例子,我们要设置颜色为红色:

Objective-C:UIColor *redColor1 = [UIColor redColor];UIColor *redColor2 = [UIColor colorWithRed:255/256.0 green:0.0 blue:0.0 alpha:1.0];
Swift:let redColor1 = UIColor.redlet redColor2 = UIColor(red: 255/256.0, green: 255/256.0, blue: 255/256.0, alpha: 1.0)

我们知道,RGB分别表示三种颜色通道,分别是RedGreenBlue,什么是RGB,而目前颜色表达方式有两种:32位和24位。用3种颜色通道表达24位表达方式(32位的添加了透明度支持),那么每位颜色通道表示范围就是:0~256。但是因为UIColor传入的参数为0~1之间,所以我们需要将数值除以256。

上面便是我个人对RGB的理解,下面贴出RGB常用颜色表链接:

RGB颜色通道

2.使用

一般我们使用RGB时可以将代码以宏的方式表现出来:

Objective-C:#define RGBCOLOR(r, g, b, a) [UIColor colorWithRed:(r)/256.0 green:(g)/256.0 blue:(b)/256.0 alpha:(a)]Swift:func RGBColor(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) -> UIColor {    return UIColor(red: r/256.0, green: g/256.0, blue: b/256.0, alpha: a)}

所以上面就可以写成:

UIColor *redColor3 = RGBCOLOR(255, 0, 0, 1);

下面介绍另一种,就是用#开头后面加上6位数字字母表示的,比如:白色是#FFFFFF,那么这又是什么意思了?

接下来让我小小的揣测一下,我们知道白色用RGB都是255,那么是不是就意味着FF=255, FF=255, FF=255了。

其实这种#字表示颜色法,用的是16进制表示的,本质上还是用的RGB,所以如果我们遇到美工切图用的这种表示方法,我们可以将其转换为RGB方法,转换规则为:
R=第一位*16+第二位,G=第三位*16+第四位,B=第五位*16+第六位

举个例子:我们在RGB颜色通道中看到印度红色是:#B0171F,运用转换公式就是:

R = B * 16 + 0 = 11 * 16 = 176G = 1 * 16 + 7 = 23B = 1 * 16 + F = 16 + 15 = 31

这与我们在网站中看到的是一致的。

3.扩展

不过感觉这还是不方便啊,所以接下来提供一个更加完美的方法,那就是给颜色添加分类,话不多说,添上代码:

Objective-C:#import <UIKit/UIKit.h>@interface UIColor (Hex)// 默认alpha位1+ (UIColor *)colorWithHexString:(NSString *)color;//从十六进制字符串获取颜色,//color:支持@“#123456”、 @“0X123456”、 @“123456”三种格式+ (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha;@end#import "UIColor+Hex.h"@implementation UIColor (Hex)+ (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    //如果是0x开头的,那么截取字符串,字符串从索引为2的位置开始,一直到末尾    if ([cString hasPrefix:@"0X"])    {        cString = [cString substringFromIndex:2];    }    //如果是#开头的,那么截取字符串,字符串从索引为1的位置开始,一直到末尾    if ([cString hasPrefix:@"#"])    {        cString = [cString substringFromIndex:1];    }    if ([cString length] != 6)    {        return [UIColor clearColor];    }    // 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:alpha];}//默认alpha值为1+ (UIColor *)colorWithHexString:(NSString *)color{    return [self colorWithHexString:color alpha:1.0f];}@end
Swift:extension UIColor {    func colorWithHex(color: NSString, alpha: CGFloat) -> UIColor {        // 去除特殊符号        var cString = color.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() as NSString        if cString.length < 6 {            return UIColor.clear        }        if cString.hasPrefix("0X") {            cString = cString.substring(from: 2) as NSString        }        if cString.hasPrefix("#") {            cString = cString.substring(from: 1) as NSString        }        if cString.length != 6 {            return UIColor.clear        }        var range = NSRange()        range.length = 2        range.location = 0        let rStr = cString.substring(with: range) as NSString        range .location = 2        let gStr = cString.substring(with: range) as NSString        range.location = 4        let bStr = cString.substring(with: range) as NSString        var r: uint = 0, g: uint = 0, b: uint = 0        Scanner.init(string: rStr as String).scanHexInt32(&r)        Scanner.init(string: gStr as String).scanHexInt32(&g)        Scanner.init(string: bStr as String).scanHexInt32(&b)        return UIColor(red: CGFloat(r)/256.0, green: CGFloat(g)/256.0, blue: CGFloat(b)/256.0, alpha: alpha)    }}

以上纯属个人看法,如有漏洞希望大家指出来,感谢!

原创粉丝点击