一.前言

  在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. UWP开发入门(二十一)——保持Ui线程处于响应状态

    GUI的程序有时候会因为等待一个耗时操作完成,导致界面卡死.本篇我们就UWP开发中可能遇到的情况,来讨论如何优化处理. 假设当前存在点击按钮跳转页面的操作,通过按钮打开的新页面,在初始化过程中存在一些 ...

  2. 实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部

    判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据 ...

  3. 前端scss的使用及gulp发布方式

    如标题所述,这篇博文是说scss以及gulp发布方式: 如果你没用过scss和gulp或不甚了解,你可以看看这篇博文,叙说的水平有限,各位看官大神见谅: 说scss之前,先来说说sass,sass是一 ...

  4. html的<meta>标签的作用

    <meta>标签包含了页面文档的上下文信息. 主要包含的上下文信息: 1.配置了服务器向浏览器响应时,http协议的head信息,浏览器根据head执行相应操作. 2.对页面的描述信息,便 ...

  5. ASP.NET MVC使用jQuery实现Autocomplete

    Insus.NET的以前的ASP.NET MVC的练习中,也有实现过Autocomplete的功能.依次是使用jQuery来实现. 首先在数据库准备一些数据: CREATE TABLE [dbo].[ ...

  6. linux操作命令等积累

    1,启动服务:两种方式: /etc/init.d/networking start  /etc/init.d/mysql start #:service mysql start  service ne ...

  7. C# Winform MD5加密学习积累

    string password = txtPassword.Text.Trim(); byte[] result = Encoding.Default.GetBytes(password); MD5 ...

  8. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  9. setcookie第三个值为什么写0

  10. JVM基本原理

    第一节 JVM内存模型 •堆栈简称栈,主要提供以下用途: –保存临时数据 –放置临时变量(局部.自动.堆栈) –保存调用现场 –方法返回值的传递 •堆主要提供以下用途: –存放对象(GC对象) –存放 ...