iOS开发--遇到ARGB/RGBA怎么办
一.前言
在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怎么办的更多相关文章
- iOS开发——图层OC篇&UIColor深入研究(CGColor,CIColor)
UIColor深入研究(CGColor,CIColor) 由于跟人比较喜欢研究关于图层与动画方面的技术,正打算看看别人写的好东西,就遇到了好几个问题, 第一:UIClor类方法的使用 就是关于UICo ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- [BS-17] iOS开发-Alpha,Hidden和Opaque区别
iOS开发-Alpha,Hidden和Opaque区别 UIView控件都有Alpha,Hidden和Opaque这三个常见属性,UIView控件BackgroundColor是用RGBA表示的, ...
- iOS开发中的常用宏定义
在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog( ...
- iOS开发经常使用宏定义
iOS开发经常使用宏定义 iOS开发中经常须要获取屏幕宽度高度,为view设置颜色,为imgagView设置图片等,我们都可定义一些宏,随时都可拿来使用,方便开发 <span style=&qu ...
- OpenCV iOS开发(一)——安装(转)
OpenCV是一个开源跨平台的的计算机视觉和机器学习库,可以用来做图片视频的处理.图形识别.机器学习等应用.本文将介绍OpenCV iOS开发中的Hello World起步. 安装 OpenCV安装的 ...
- 李洪强iOS开发之性能优化技巧
李洪强iOS开发之性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
随机推荐
- javascript日期验证:填写的日期大于等于当前日期
<script> $(function () { var d = new Date(); var strDate = getDateStr(d); $("#beginTime&q ...
- ligerUI布局时,Center中的Tab高度太小问题解决
1.0 引用的js,css <link href="/Content/scripts/ligerUI/skins/Aqua/css/ligerui-all.css" rel= ...
- ASP.NET MVC在线预览Excel、Word、TXT、PDF文件
代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...
- VS2015如何创建单元测试并启动调试
1: 添加单元测试 2:打开单元测试类 关键点: 类上加上标记:[TestClass],方法上添加标记:[TestMethod],方法输出使用:Assert.IsNotNull(s,"测试失 ...
- 【SQL】SQL2012离线帮助文档安装不上的处理手记
注:解决方法在最后,心急的童鞋可以直接往下滚动. 我SQL实例装的是2008 R2版,由于该版自带的SSMS(Microsoft SQL Server Management Studio 管理工具)存 ...
- Bootstrap学习笔记系列6-----Bootstrap文本显示
通过对文本或者链接添加下面的类,会使其展示不同的颜色,如果文本是个链接,鼠标移动到文本上,颜色会变暗. text-muted柔和的文本(深色) text-primary 表示基础的文本(蓝色) tex ...
- 紫橙绿蓝的jQuery幻灯片切换
效果展示 http://hovertree.com/texiao/jquery/77/ 看惯了左右切换的幻灯片,何问起向您推荐一个新颖的,旋转切换,通过点击按钮的相应区域可以使幻灯片以旋转的方式来 ...
- LCA---Tarjan算法
本问题中Tarjan算法不需要设置栈和dfn,low标号,而是设置了并查集. 通过一次dfs遍历即可找出所有节点对的lca.将这样一次读取所有查询,计算一次后返回所有查询lca的算法称为离线算法 涉及 ...
- Time series database
https://en.wikipedia.org/wiki/Time_series_database https://influxdb.com/docs/v0.9/introduction/getti ...
- final static 深度解析
function test(){ var a = b = 10; } test( ); alert(b); 由上一篇博客说起,最后输出的是10.引起歧义的原因是全局变量和局部变量的关系.顺着这个话题, ...