颜色(一):UIColor
来源:互联网 发布:淘宝女士运动套装 编辑:程序博客网 时间:2024/06/11 06:14
前言
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}; // blue CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue); CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK: %@", colorCMYK); // color with CGColor, uicolor will just retain it UIColor *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 ) //创建CIColor CIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor]; NSLog(@"cicolor: %@", ciColor);//cicolor: (1 1 1 1) NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);//cicolor colorspace: <CGColorSpace 0x7fabf3f349f0> (kCGColorSpaceDeviceGray) //创建UIColor UIColor* 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 ---> kCGColorSpaceDeviceRGB NSLog(@"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 1 NSLog(@"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 kCGColorSpaceDeviceCMYK CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK(); NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace));//Components number: 4 CGFloat cmykValue[] = {1, 1, 0, 0, 1}; // blue CGColorRef 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 Colorspace NSLog(@"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 1 NSLog(@"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
- 支持十六进制设置颜色的UIColor分类(UIColor+WWAdditions)
- iOS 生成随机颜色(UIColor)
- Swift中的UIColor使用(随机颜色、自定义颜色)
- 十六进制颜色转UIColor
- 十六进制颜色转 UIColor
- 6.Uicolor(颜色类)
- UIColor & 颜色集
- IOS UIColor 自定义颜色
- IOS UIColor 自定义颜色
- UIColor 自定义颜色 透明度
- 十六进制颜色转UIColor
- 十六进制颜色转UIColor
- 字符串颜色转成UIColor
- UIcolor RGB颜色
- UIColor自定义颜色
- IOS UIColor 自定义颜色
- IOS UIColor 自定义颜色
- 网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的
- SET character_set_connection=utf8
- Error:程序包android.support.v4.app不存在;Error:找不到类FragmentActivity
- Android之AIDL使用详解
- [R] Bind element of List of matrix or data.frame or list
- 颜色(一):UIColor
- CentOS6.4下安装MySql
- 码农路,渐行渐远
- iOS初学快捷键
- 数据库第二范式
- 文章标题
- Maven Pom 文件中的隐式依赖导致Jar冲突
- [俄勒冈大学]养成Python写作习惯
- Codeforces Round #338 (Div. 2)B. Longtail Hedgehog解题报告