一.前言

  在iOS开发过程中,我们经常会用16进制来表示色值,一般来说我们都是这样表示的:比如#000000表示黑色,#ffffff表示白色,但是如果我们想来个透明度呢?

  接下来就让我们来了解一下怎么来搞argb/rgba的色值。

二.先来了解一下基础知识(和iOS无关,通用)

1.十六进制颜色码

  简单来说,就是以#开头的6位十六进制数值表示一种颜色。

  在rgb中,红色可以表示成(255,0,0)那么255转换成16进制(这里用255/16进行计算)就是FF,0还是00,所以红色的十六进制表示就是#FF0000。

2.左移<</右移>>

  12<<2,将12左移2位结果是多少呢?

  首先,将12转成2进制:1100,左移就是1100向左移动2位,然后将其与位数补0,也就是0000也就是0。

  12>>2,转2进制为1100,然后将其右移2位,其余位数补0,也就是0011,也就是3。

三.走进iOS,处理argb

  废话少说,直接上代码:

+ (UIColor *)colorWithHextColorString:(NSString *)hexColorString {
//这里是alpha传1,在colorWithHextColorString alpha 里面做了alpha修改
return [self colorWithHextColorString:hexColorString alpha:1.0f];
}
//支持rgb,argb
+ (UIColor *)colorWithHextColorString:(NSString *)hexColorString alpha:(CGFloat)alphaValue {
UIColor *result = nil;
unsigned int colorCode = ;
unsigned char redByte, greenByte, blueByte;
//排除掉 @\"
if ([hexColorString hasPrefix:@"@\""]) {
hexColorString = [hexColorString substringWithRange:NSMakeRange(2, hexColorString.length-3)];
} //排除掉 #
if ([hexColorString hasPrefix:@"#"]) {
hexColorString = [hexColorString substringFromIndex:];
} if (nil != hexColorString)
{
NSScanner *scanner = [NSScanner scannerWithString:hexColorString];
(void) [scanner scanHexInt:&colorCode]; // ignore error
}
redByte = (unsigned char) (colorCode >> );
greenByte = (unsigned char) (colorCode >> );
blueByte = (unsigned char) (colorCode); // masks off high bits if ([hexColorString length]==) { //如果是8位,就那其中的alpha
alphaValue = (float)(unsigned char)(colorCode>>)/0xff;
} NSLog(@"alpha:%f----r:%f----g:%f----b:%f",alphaValue,(float)redByte/0xff,(float)greenByte/0xff,(float)blueByte/0xff);
result = [UIColor
colorWithRed: (float)redByte / 0xff
green: (float)greenByte/ 0xff
blue: (float)blueByte / 0xff
alpha:alphaValue];
return result; }

来个测试:比如FF0000,结果如下:

AEFF0000(AE:10进制就是174),运行结果如下:

完美地实现了argb解析方法。

简单介绍一下其实现:

  首先,我将colorWithHextColorString: alpha:的方法alpha值设置为1,也就是不透明。

  然后在colorWithHextColorString: alpha:中,首先过滤掉传入的hexColorString的其他非法字符,例如#等。然后利用NSScanner进行数据扫描,将其转换成10进制。

  然后通过移位操作,获取red,green,blue的值,如果hexColorString是8位,则意味着hexColorString中包含了alpha的值,右移24位获取alphaValue的值。

  最后通过

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

方法设置其颜色。

  这里面可能比较难以理解的就是移位操作。让我们来简单介绍一下吧。

  首先,经过排除掉@\“和#之后的hexColorString为AEFF0000,然后扫描的结果colorCode为:2935947264。然后进行移位操作(利用上面的做法),将colorCode>>16的结果是44799(在控制台po colorCode>>16即可),利用计算器也可以算出该值。然后我们这样输出:

po (unsigned char)(colorCode>>)

结果是\xff,也就是16进制的ff,也就是hexColorString的red部分。这里面只是多加了一个unsigned char,就变成了16进制的ff,有点不太理解(也许是苹果内部做了转换),然后再利用

(float)(unsigned char)(colorCode>>)/0xff

得到float值将其代入UIColor的类方法里面进行解析。最后得到所需要的颜色。

注:如果是rgba,你可以将移位稍微修改一下就可以实现rgba解析了。

四.结语

  简单就这么多了。有什么疑问随时联系。

iOS开发--遇到ARGB/RGBA怎么办的更多相关文章

  1. iOS开发——图层OC篇&UIColor深入研究(CGColor,CIColor)

    UIColor深入研究(CGColor,CIColor) 由于跟人比较喜欢研究关于图层与动画方面的技术,正打算看看别人写的好东西,就遇到了好几个问题, 第一:UIClor类方法的使用 就是关于UICo ...

  2. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  3. [BS-17] iOS开发-Alpha,Hidden和Opaque区别

    iOS开发-Alpha,Hidden和Opaque区别   UIView控件都有Alpha,Hidden和Opaque这三个常见属性,UIView控件BackgroundColor是用RGBA表示的, ...

  4. iOS开发中的常用宏定义

    在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog( ...

  5. iOS开发经常使用宏定义

    iOS开发经常使用宏定义 iOS开发中经常须要获取屏幕宽度高度,为view设置颜色,为imgagView设置图片等,我们都可定义一些宏,随时都可拿来使用,方便开发 <span style=&qu ...

  6. OpenCV iOS开发(一)——安装(转)

    OpenCV是一个开源跨平台的的计算机视觉和机器学习库,可以用来做图片视频的处理.图形识别.机器学习等应用.本文将介绍OpenCV iOS开发中的Hello World起步. 安装 OpenCV安装的 ...

  7. 李洪强iOS开发之性能优化技巧

    李洪强iOS开发之性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view ...

  8. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  9. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

随机推荐

  1. HashSet 与TreeSet和LinkedHashSet的区别

    Set接口      Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.      Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...

  2. CHARFORMAT2 structure

    CHARFORMAT2 structure 包含在丰富的编辑控件中的字符格式设置的信息.charformat2是微软丰富的编辑CHARFORMAT结构2扩展.微软丰富的编辑2允许您使用结构与em_ge ...

  3. iOS阶段学习第17天笔记(NSFileManager-NSFileHandle-文件操作)

    iOS学习(OC语言)知识点整理 一.单例模式 1)单例是一种编程思想,一个设计模式,与语言无关在采用了单例对象的应用程序中,需要单例类自行提供实例化单例对象, 不管实例化单例对象多少次,只有一个对象 ...

  4. iOS阶段学习第二天笔记(数据类型与进制)

    iOS学习(C语言)知识点整理笔记 1.C语言32个关键字 一.存储相关 1)auto 声明自动变量 2)register 声明寄存器变量 3)volatile 声明的变量在程序执行过程中可能被隐含的 ...

  5. C# 站点IP访问频率限制 针对单个站点

    0x00 前言 写网站的时候,或多或少会遇到,登录,注册等操作,有时候,为了防止别人批量进行操作,不得不做出一些限制IP的操作(当前也可以用于限制某个账号的密码校验等). 这样的简单限制,我们又不想对 ...

  6. LeetCode5:Longest Palindromic Substring

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  7. jquery简单原则器(匹配第一个元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. jquery基本选择器id

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. DatagramSocket收发UDP数据包

    Java的Socket通信分为TCP和UDP两种,Socket和ServerSocket类用于TCP通信,DatagramSocket用于UDP通信. 使用DatagramSocket发送UDP数据包 ...

  10. MacOS下如何进行Git的冲突(Conflict)处理

    Git在做merge时经常碰到冲突的问题,多数情况都是用IDE中集成的"解决冲突"工具解决了,但有时不能依赖IDE时,就得回过头来去搞清楚Git的一些基础操作了. mergetoo ...