前言

UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化。UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色,红色,透明色等,这些颜色的色彩空间也不尽相同(白色和黑色是kCGColorSpaceDeviceGray,红色的色彩空间是kCGColorSpaceDeviceRGB)。
此外UIColor还有两个重要的属性:一个是CGColor,一个是CIColor(5.0之后添加)。这两个属性就可以把UIColor,CGColor,CIColor三个对象联系起来了,现在先介绍UIColor。

一、创建颜色的方法

  • 1、 + (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha;

    参数:white:范围为0~1,代表黑~白,中间过度灰色;alpha:透明度,0~1,0为完全透明,1为不透明;
    
  • 2、 + (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;

    参数:hue           :色调;saturation :饱和度;brightness:亮度;alpha        :透明度;
    
  • 3、 + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

    参数:red    :红green:绿blue  :蓝alpha:透明度
    
  • 4、 + (UIColor *)colorWithCGColor:(CGColorRef)cgColor;
    通过一个CGColorRef来创建颜色;当UIColor使用CGColor初始化的时候,所有CGColorRef包含的信息,都会被原封不动的保留,其中就包括ColorSpace,而且UIColor其实是直接保留了一份CGColorRef对象;
    例如:
    CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blueCGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);CGColorSpaceRelease(cmykSpace);NSLog(@"colorCMYK: %@", colorCMYK);// color with CGColor, uicolor will just retain itUIColor *color = [UIColor colorWithCGColor:colorCMYK];NSLog(@"CGColor from UIColor: %@", color.CGColor);

打印:

colorCMYK: [ (kCGColorSpaceDeviceCMYK)] ( 1 1 0 0 1 )
CGColor from UIColor: [ (kCGColorSpaceDeviceCMYK)] ( 1 1 0 0 1 )

  • 5、 + (UIColor )colorWithPatternImage:(UIImage )image;

    通过一张图片获取颜色
    
  • 6、 + (UIColor )colorWithCIColor:(CIColor )ciColor NS_AVAILABLE_IOS(5_0);
    通过一个ciCilor对象来创建颜色;当使用CIColor来初始化一个UIColor的时候,再去访问UIColor的CGColor属性的时候,我们会发现CGColor的color space和设置CIColor的color space的是不完全一样的,在这个过程中CIColor会为我们呢做一个转换。下面我们分别看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三种颜色来初始化一个CIColor的时候,再去使用该CIColor去初始化一个UIColor,然后再访问其CIColor,CGColor属性,查看颜色空间并打印颜色信息;

(1)、使用kCGColorSpaceDeviceGray初始化CIColor

    NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor);//CGColor white color:<CGColor 0x7fabf3f3a1f0> [<CGColorSpace 0x7fabf3f349f0> (kCGColorSpaceDeviceGray)] ( 1 1 )//创建CIColorCIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor];NSLog(@"cicolor: %@", ciColor);//cicolor: (1 1 1 1)NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);//cicolor colorspace: <CGColorSpace 0x7fabf3f349f0> (kCGColorSpaceDeviceGray)//创建UIColorUIColor* uicolor = [UIColor colorWithCIColor:ciColor];NSLog(@"uicolor:%@", uicolor);//color CIColor 1 1 1 1// Core Image converts all color spaces to the Core Image working color// space before it passes the color space to the filter kernel.// kCGColorSpaceDeviceGray ---> kCGColorSpaceDeviceRGBNSLog(@"cicolor from UIColor: %@", uicolor.CIColor);//cicolor from UIColor: (1 1 1 1)NSLog(@"cicolor's colorspace: %@", uicolor.CIColor.colorSpace);//cicolor's colorspace: <CGColorSpace 0x7fabf3f349f0> (kCGColorSpaceDeviceGray)NSLog(@"uicolor CGColor: %@", uicolor.CGColor);//color's CGColor: <CGColor 0x7fabf3f38bc0> [<CGColorSpace 0x7fabf3e0c5a0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )

总结:

通过运行程序,我们看出来,如果使用一个kCGColorSpaceDeviceGray的颜色空间的CGColor来初始化CIColor的时候,我们呢可以看到CIColor的色彩空间一直是kCGColorSpaceDeviceGray,通过访问UIColor的CGColor属性的时候,通过打印可以发现其色彩空间已经转变成了kCGColorSpaceDeviceRGB空间了,二颜色值也正确的从原来的颜色空间转换到了新的颜色空间。

(2)、使用kCGColorSpaceDeviceRGB初始化CIColor

    NSLog(@"CGColor red color:%@", [UIColor redColor].CGColor);//CGColor red color:<CGColor 0x7fd0524290c0> [<CGColorSpace 0x7fd052512c20> (kCGColorSpaceDeviceRGB)] ( 1 0 0 1 )CIColor *ciColor = [CIColor colorWithCGColor:[UIColor redColor].CGColor];NSLog(@"cicolor: %@", ciColor);//cicolor: (1 0 0 1)NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);//cicolor colorspace: <CGColorSpace 0x7fd052512c20> (kCGColorSpaceDeviceRGB)UIColor *uicolor = [UIColor colorWithCIColor:ciColor];NSLog(@"uicolor %@", uicolor);//color CIColor 1 0 0 1NSLog(@"cicolor from UIColor: %@", uicolor.CIColor);//cicolor from UIColor: (1 0 0 1)NSLog(@"cicolor's colorspace: %@", uicolor.CIColor.colorSpace);//cicolor's colorspace: <CGColorSpace 0x7fd052512c20> (kCGColorSpaceDeviceRGB)NSLog(@"uicolor CGColor: %@", uicolor.CGColor);//uicolor's CGColor: <CGColor 0x7fd052429fe0> [<CGColorSpace 0x7fd052512c20> (kCGColorSpaceDeviceRGB)] ( 1 0 0 1 )

总结:

整个过程中CIColor,以及通过UIColor的CGColor和CIColor属性访问到的值,打印出来我们可以发现他们都是kCGColorSpaceDeviceRGB空间的;

(3)、使用kCGColorSpaceDeviceCMYK初始化CIColor

    // test kCGColorSpaceDeviceCMYKCGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace));//Components number: 4CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blueCGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);CGColorSpaceRelease(cmykSpace);NSLog(@"colorCMYK: %@", colorCMYK);//colorCMYK: <CGColor 0x7ff6184a31c0> [<CGColorSpace 0x7ff618722cf0> (kCGColorSpaceDeviceCMYK)] ( 1 1 0 0 1 )CIColor* ciColor = [CIColor colorWithCGColor:colorCMYK];NSLog(@"cicolor: %@", ciColor);//cicolor: (0 0 1 1)// in fact,the color value of CIColor has converted to RGB ColorspaceNSLog(@"cicolor colorspace: %@", ciColor.colorSpace);//cicolor colorspace: <CGColorSpace 0x7ff618722cf0> (kCGColorSpaceDeviceCMYK)UIColor* uicolor = [UIColor colorWithCIColor:ciColor];NSLog(@"UIColor with CIColor: %@", uicolor);//UIColor with CIColor: CIColor 0 0 1 1NSLog(@"cicolor from UIColor: %@", uicolor.CIColor);//cicolor from UIColor: (0 0 1 1)NSLog(@"cicolor's colorspace: %@", uicolor.CIColor.colorSpace);//cicolor's colorspace: <CGColorSpace 0x7ff618722cf0> (kCGColorSpaceDeviceCMYK)NSLog(@"cgcolor from UIColor: %@", uicolor.CGColor);//cgcolor from UIColor: <CGColor 0x7ff6184a6590> [<CGColorSpace 0x7ff61840a930> (kCGColorSpaceDeviceRGB)] ( 0 0 1 1 )

总结:

整个过程中,我们通过运行同样可以发现,当我们用一个CMYK颜色空间的CGColor来初始化CIColor的时候,CIColor的颜色空间依然是CMYK,但是颜色值已经转换成RGB的颜色值。当使用该CIColor创建一个UIColor的时候,我们再通过CIColor和CGColor属性打印信息的时候,我们会发现CIColor的色彩空间依然是CMYK,但是CGColor打印所得到的信息说明它已经被转换成RGB空间了。

二、初始化颜色的方法

  • 1、 - (UIColor *)initWithWhite:(CGFloat)white alpha:(CGFloat)alpha;
  • 2、 - (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;
  • 3、 - (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
  • 4、 - (UIColor *)initWithCGColor:(CGColorRef)cgColor;
  • 5、 - (UIColor )initWithPatternImage:(UIImage)image;
  • 6、 - (UIColor )initWithCIColor:(CIColor )ciColor NS_AVAILABLE_IOS(5_0);

三、内置颜色

// Some convenience methods to create colors.  These colors will be as calibrated as possible.
// These colors are cached.
  • (1)、+ (UIColor *)blackColor; // 0.0 white

  • (2)、+ (UIColor *)darkGrayColor; // 0.333 white

  • (3)、+ (UIColor *)lightGrayColor; // 0.667 white

  • (4)、+ (UIColor *)whiteColor; // 1.0 white

  • (5)、+ (UIColor *)grayColor; // 0.5 white

  • (6)、+ (UIColor *)redColor; // 1.0, 0.0, 0.0 RGB

  • (7)、+ (UIColor *)greenColor; // 0.0, 1.0, 0.0 RGB

  • (8)、+ (UIColor *)blueColor; // 0.0, 0.0, 1.0 RGB

  • (9)、+ (UIColor *)cyanColor; // 0.0, 1.0, 1.0 RGB

  • (10)、+ (UIColor *)yellowColor; // 1.0, 1.0, 0.0 RGB

  • (11)、+ (UIColor *)magentaColor; // 1.0, 0.0, 1.0 RGB

  • (12)、+ (UIColor *)orangeColor; // 1.0, 0.5, 0.0 RGB

  • (13)、+ (UIColor *)purpleColor; // 0.5, 0.0, 0.5 RGB

  • (14)、+ (UIColor *)brownColor; // 0.6, 0.4, 0.2 RGB

  • (15)、+ (UIColor *)clearColor; // 0.0 white, 0.0 alpha

四、其他

  • 1、 - (UIColor *)colorWithAlphaComponent:(CGFloat)alpha;

    获取当前颜色改变透明度后的一个颜色
    
  • 2、 - (void)set;

    设置颜色:在当前绘制上下文中设置填充和线段颜色;
    
  • 3、 - (void)setFill;

    设置填充;
    
  • 4、- (void)setStroke;

    设置线段;
    

    例如:

- (void)drawRect:(CGRect)rect{[super drawRect:rect];[[UIColor redColor]setStroke];[[UIColor purpleColor]setFill];//1.获得图形上下文CGContextRef context=UIGraphicsGetCurrentContext();//2.绘制路径(相当于前面创建路径并添加路径到图形上下文两步操作)CGContextMoveToPoint(context, 20, 50);CGContextAddLineToPoint(context, 20, 100);CGContextAddLineToPoint(context, 300, 100);//封闭路径:a.创建一条起点和终点的线,不推荐//CGPathAddLineToPoint(path, nil, 20, 50);//封闭路径:b.直接调用路径封闭方法CGContextClosePath(context);    //4.绘制路径CGContextDrawPath(context, kCGPathFillStroke);
}

  • 5、判断两个颜色是否相等
    不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的。CoreGraphics中提供一个方法可以判断两个CGColor是否相等,因此我们可以通过判断两个UIColor是否相等,请大家看下面例子:
    if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {NSLog(@"The two CGColor is equal!");}else {NSLog(@"The two CGColor is not equal!");}if (CGColorEqualToColor([UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {NSLog(@"The two CGColor is equal!");}else {NSLog(@"The two CGColor is not equal!");}

例子中第一部分是判断两个白色的UIColor是否相等,虽然都是白色,但是颜色控件是不一样的,通过运行我们可以发现,打印出『 The two CGColor is not equal!』。例子的第二部分简单的创建两个RGB空间的UIColor,运行程序可以看出,这两个颜色是相同的。

  • 6、 访问底层的CGColor// Access the underlying CGColor or CIColor.

    @property(nonatomic,readonly) CGColorRef CGColor;
    - (CGColorRef)CGColor NS_RETURNS_INNER_POINTER CF_RETURNS_NOT_RETAINED;
    
    UIColor *color = [UIColor whiteColor];NSLog(@"CGColor from UIColor %@", color.CGColor);

打印:

CGColor from UIColor <CGColor 0x7f8411f61ac0> [<CGColorSpace 0x7f8411e63990> (kCGColorSpaceDeviceGray)] ( 1 1 )
  • 7、 访问底层的CIColor// Access the underlying CGColor or CIColor.

    #if __has_include(<CoreImage/CoreImage.h>)
    @property(nonatomic,readonly) CIColor  *CIColor NS_AVAILABLE_IOS(5_0);
    #endif
    
    UIColor *color = [UIColor whiteColor];//未使用CIColor初始化的颜色,使用如下方法获取CIColor会产生崩溃NSLog(@"CIColor from UIColor %@", color.CIColor);   // crush

颜色(一):UIColor相关推荐

  1. 16进制颜色转换为UIColor

    objc #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >& ...

  2. iOS swift设置颜色,UIColor和Color Set

    if #available(iOS 11.0, *) {tabBar.tintColor = UIColor(named: "colorMain")} else {// Fallb ...

  3. iOS 将16进制颜色转换成UIColor

    很多地方我们都使用16进制颜色,但iPhone使用的是UIColor对象,不直接支持16进制颜色,为此,需要我们手动将16进制颜色转换为UIColor - (UIColor *) hexStringT ...

  4. UIColor的RGB定义颜色(灰色)

    原文链接:http://www.isaced.com/post-140.html 做界面的时候常常会用到UIColor这个类,这是苹果的一个表示颜色的类. 想要表示一种颜色,UIColor 有默认的颜 ...

  5. UIColor 颜色集

    UIColor代表颜色,有时候会表示透明度. 基础 常用方法 +(UIColor *)colorWithWhite:(CGFloat) white alpha:(CGFloat)alpha 返回一个颜 ...

  6. [Iphone开发小记] UIColor 的RGBA定义颜色 (colorWithRed)

    做界面的时候常常会用到UIColor这个类,这是苹果的一个表示颜色的类. 想要表示一种颜色,UIColor 有默认的颜色,WhiteColor,BlackColor..... 也可以用RGB来初始化颜 ...

  7. iOS 十六进制的颜色值转换为UIColor

    UIColor+Hex.h里面中 #import <UIKit/UIKit.h>@interface UIColor (Hex) + (UIColor *) colorWithHexStr ...

  8. iPhone UITextField-更改占位符文本颜色

    我想更改在UITextField控件中设置的占位符文本的颜色,以使其变为黑色. 我宁愿在不使用普通文本作为占位符的情况下执行此操作,也不必重写所有方法来模仿占位符的行为. 我相信如果我重写此方法: - ...

  9. IOS开发之——颜色设置

    颜色设置: 指定RGB,參数是:红.绿.黄.透明度,范围是0-1 + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(C ...

  10. iOS 直接使用16进制颜色

    在做iOS开发时,一般我们会吸色,就是产品给的图我们一般会吸色,但是最近吸色时候,老大说有较大的颜色偏差,所以要求我们直接使用UI给出的额16进制颜色,你也可以搜索<RGB颜色值转换成十六进制颜 ...

最新文章

  1. PHP中单例模式:三私一公是什么?
  2. html5 直接获取当前位置,HTML5调用百度地图API获取当前位置并直接导航目的地的方法...
  3. 马斯克成功把人从太空送回地球!历时64天,SpaceX首次载人任务圆满收工
  4. windows下安装pygtk报g_assertion_message无法定位libglib-2.0-0.dll错误解决
  5. R语言实战应用精讲50篇(一)-万字长文干货R语言ggplot2包图形绘制
  6. 常用服务器性能分析工具
  7. java客户姓名添加和查找_java类与对象 演练 客户姓名添加与查看
  8. win7电脑假死机怎么办
  9. http是不是中间件_等保2.0涉及的Apache Tomcat中间件(上)
  10. dstwo linux 模拟器,dstwo gba 模拟器-TempGBA下载V1.44 最新版-西西游戏下载
  11. 2021年9月份最新数据库排行榜出炉
  12. 七大江河水系--长江(二)
  13. 查找同一网络的计算机,怎么从网络中查询另一台计算机的ip地址
  14. 2015年3月31日通过VMware VCP 认证
  15. 深度学习100问之深入理解Vanishing/Exploding Gradient(梯度消失/爆炸)
  16. Cent OS 使用nohup 启动 Springboot避坑
  17. 在线网络打字系统_打字比赛系统软件
  18. “Android开发3年老板嫌我工资高,把我辞了…”
  19. 《设计模式之禅》中23种设计模式demo汇总
  20. 区块链的未来发展趋势

热门文章

  1. c语言从哪里开始学,杭州c语言学习从哪里开始
  2. 巴比特 | 元宇宙每日必读:生成式AI会对下一代互联网产生怎样的影响?GPT会成为AI时代的操作系统吗?元宇宙又该何去何从?...
  3. 老薛主机磁盘空间满了怎么办
  4. 网络错误7002_SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3nbsp...
  5. 高通9x07平台关于模块modem射频 RF MCFG生成MBN的总结
  6. onvif协议+高性能rtspclient打通大屏投屏协议(一)
  7. 20多行js实现canvas雪夜下雪效果
  8. c#调用ping命令
  9. ds1302模块 树莓派_Arduino控制DS1302时钟芯片(ds1302引脚图及功能和应用电路)
  10. Android——LitePal