内容简介:玩转 swift -- UIKit 之 UIColor
前言
UIColor类是UIKit中用来存储颜色数据的一个类,想要清晰的了解这个类中的相关属性、方法,则需要先了解一个名词: 颜色空间 。
不同的设备处理颜色的方式是不同的, 每个设备都有他所支持的颜色范围, 在一个设备上产生的颜色可能在另一台设备上无法提供.所以,不同的设备就可能会具有不同的颜色空间,去解析相应的颜色数据(比如UIColor)。
特别的,在iOS系统中,必须使用 设备颜色空间(device color space) 。
在iOS 10之前的iOS版本上,以及在iOS 10之前的iOS版本上链接的应用程序,可以在两个颜色空间之一中创建和返回颜色:
Device-Dependent Gray Device-Dependent RGB
iOS 10之后或之后连接,并且在iOS 10或更高版本上运行,则颜色将在扩展颜色空间中创建:
kCGColorSpaceExtendedGray kCGColorSpaceExtendedSRGB
在 CoreGraphics中有个CGColorSpace 类, 这个类可以用来获取不同的设备颜色空间,举例(三个比较常见的颜色空间)如下:
// 一个device-dependent 灰度颜色空间 @available(iOS 2.0, *) public func CGColorSpaceCreateDeviceGray() -> CGColorSpace // 一个device-dependent RGB颜色空间 @available(iOS 2.0, *) public func CGColorSpaceCreateDeviceRGB() -> CGColorSpace // 一个device-dependent CMYK颜色空间 @available(iOS 2.0, *) public func CGColorSpaceCreateDeviceCMYK() -> CGColorSpace
然后还要了解的是 UIColor、CGColor、CIColor
之间的关系及转化,本篇文章主要讲 UIColor
的相关知识,这篇文章对于三者之间的关系讲的很详尽,自己就不重复造轮子了,假如你理解了颜色空间与颜色数据之间的关系,那么这篇文章也就很好理解了。
进入正题(基于iOS 10)
一、创建系统颜色
extension UIColor { // 在浅色背景上显示文本的系统颜色。 open class var lightText: UIColor { get } // 在深色背景上显示文本的系统颜色。 open class var darkText: UIColor { get } // 分组表的背景的系统颜色。 open class var groupTableViewBackground: UIColor { get } }
测试代码如下:
// 测试创建系统颜色 func testCreateSystemColor() { // 颜色空间:UIExtendedGrayColorSpace self.addImageView(color: UIColor.darkText); self.addImageView(color: UIColor.lightText); // 颜色空间:UIExtendedSRGBColorSpace self.addImageView(color: UIColor.groupTableViewBackground); } // 添加imageView func addImageView(color: UIColor) { let imageView = UIImageView.init(frame: CGRect.init(x: 40, y: 80 + self.viewIndex * 40, width: 200, height: 20)); imageView.backgroundColor = color; self.view.addSubview(imageView); print(color); self.viewIndex += 1; }
结果如下:
UIExtendedGrayColorSpace 0 1 UIExtendedGrayColorSpace 1 0.6 UIExtendedSRGBColorSpace 0.937255 0.937255 0.956863 1
二、使用预定义颜色创建颜色对象
// 黑色 open class var black: UIColor { get } // 深灰 open class var darkGray: UIColor { get } // 浅灰 open class var lightGray: UIColor { get } // 白色 open class var white: UIColor { get } // 灰色 open class var gray: UIColor { get } // 红色 open class var red: UIColor { get } // 绿色 open class var green: UIColor { get } // 蓝色 open class var blue: UIColor { get } // 蓝绿色 open class var cyan: UIColor { get } // 黄色 open class var yellow: UIColor { get } // 紫红色 open class var magenta: UIColor { get } // 橘黄色 open class var orange: UIColor { get } // 紫色 open class var purple: UIColor { get } // 褐色 open class var brown: UIColor { get } // 透明色 open class var clear: UIColor { get }
测试代码如下:
// 测试使用预定义颜色创建颜色对象 func testUsePreColorCreateColor() { // 颜色空间:UIExtendedGrayColorSpace self.addImageView(color: UIColor.black); self.addImageView(color: UIColor.darkGray); self.addImageView(color: UIColor.lightGray); self.addImageView(color: UIColor.white); self.addImageView(color: UIColor.gray); self.addImageView(color: UIColor.clear); // 颜色空间:UIExtendedSRGBColorSpace self.addImageView(color: UIColor.red); self.addImageView(color: UIColor.green); self.addImageView(color: UIColor.blue); self.addImageView(color: UIColor.cyan); self.addImageView(color: UIColor.yellow); self.addImageView(color: UIColor.magenta); self.addImageView(color: UIColor.orange); self.addImageView(color: UIColor.purple); self.addImageView(color: UIColor.brown); }
测试结果如下
UIExtendedGrayColorSpace 0 1 UIExtendedGrayColorSpace 0.333333 1 UIExtendedGrayColorSpace 0.666667 1 UIExtendedGrayColorSpace 1 1 UIExtendedGrayColorSpace 0.5 1 UIExtendedGrayColorSpace 0 0 UIExtendedSRGBColorSpace 1 0 0 1 UIExtendedSRGBColorSpace 0 1 0 1 UIExtendedSRGBColorSpace 0 0 1 1 UIExtendedSRGBColorSpace 0 1 1 1 UIExtendedSRGBColorSpace 1 1 0 1 UIExtendedSRGBColorSpace 1 0 1 1 UIExtendedSRGBColorSpace 1 0.5 0 1 UIExtendedSRGBColorSpace 0.5 0 0.5 1 UIExtendedSRGBColorSpace 0.6 0.4 0.2 1
三、在特定颜色空间中创建自定义UIColor对象
// UIExtendedGrayColorSpace 灰度分量 public init(white: CGFloat, alpha: CGFloat) // UIExtendedSRGBColorSpace HSB颜色空间分量 public init(hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) // UIExtendedSRGBColorSpace RGB颜色空间分量 public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) // UIDisplayP3ColorSpace RGB分量 @available(iOS 10.0, *) public init(displayP3Red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
测试代码如下:
// 测试在特定颜色空间创建UIColor func testCreateColorWithSpecialColorSpace() { self.addImageView(color: UIColor.init(white: 0.3, alpha: 1.0)); self.addImageView(color: UIColor.init(hue: 0.3, saturation: 0.5, brightness: 0.7, alpha: 1.0)); self.addImageView(color: UIColor.init(red: 0.3, green: 0.5, blue: 0.7, alpha: 1.0)); self.addImageView(color: UIColor.init(displayP3Red: 0.3, green: 0.5, blue: 0.7, alpha: 1.0)); }
结果如下:
UIExtendedGrayColorSpace 0.3 1 UIExtendedSRGBColorSpace 0.42 0.7 0.35 1 UIExtendedSRGBColorSpace 0.3 0.5 0.7 1 UIDisplayP3ColorSpace 0.3 0.5 0.7 1
注意:iOS 10后,通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色。
四、以现有的颜色数据创建UIColor对象
// 由指定的Quartz颜色生成一个UIcolor对象 public init(cgColor: CGColor) // 由指定的Core Image颜色生成一个UIcolor对象 @available(iOS 5.0, *) public init(ciColor: CIColor) // 创建并返回一个与原Color相同颜色空间和组件值得颜色对象,并新添了透明度。 open func withAlphaComponent(_ alpha: CGFloat) -> UIColor
测试代码如下
// 测试 color to color func testColorToColor() { // CGColor -> UIColor self.addImageView(color: UIColor.init(cgColor: CGColor.init(colorSpace: CGColorSpaceCreateDeviceCMYK(), components: [1,1,0,0,1])!)); // CIColor -> UIColor self.addImageView(color: UIColor.init(ciColor: CIColor.gray())); // UIColor ->UIColor(+alpha) self.addImageView(color: UIColor.red.withAlphaComponent(0.5)); }
测试结果如下:
kCGColorSpaceModelCMYK 1 1 0 0 1 CIColor 0.5 0.5 0.5 1 UIExtendedSRGBColorSpace 1 0 0 0.5
五、由Image转为Color
// image -> color public init(patternImage image: UIImage)
测试代码如下:
// 测试 image -> color func imageToColor() { let color = UIColor.init(patternImage: UIImage.init(named: "imageToColor")!) let imageView = UIImageView.init(frame: CGRect.init(x: 40, y: 80, width: 158, height: 154)); imageView.backgroundColor = color; self.view.addSubview(imageView); print(color); }
测试结果如下:
kCGColorSpaceModelPattern 1
建议:在实际项目中尽量避免使用这种方式加载加图片,因为这种加载方式会比直接加载图片占用更大的内存。
六、设置图形上下文的绘图颜色
// 同时设置画笔颜色和填充颜色 open func set() // 设置填充颜色 open func setFill() // 设置画笔颜色 open func setStroke()
测试代码如下:
// 测试设置图形上下文的绘图颜色 func testDrawColor() { let pathView = PathView.init(frame: self.view.bounds); self.view.addSubview(pathView); }
PathView.swift内:
override func draw(_ rect: CGRect) { let path = UIBezierPath(); path.addArc(withCenter: self.center, radius: 100.0, startAngle: 0, endAngle: 180.0, clockwise: true); path.lineWidth = 5.0; // 设置填充颜色 UIColor.red.setFill(); // 设置画笔颜色 UIColor.blue.setStroke(); path.fill(); path.stroke(); }
测试结果:
七、检索颜色信息
// 获取与此UIColor相对应的Quartz颜色 open var cgColor: CGColor { get } // 获取与此UIColor相对应的Core Image封装的颜色 @available(iOS 5.0, *) open var ciColor: CIColor { get } // 获取灰度颜色空间中组成颜色的灰度分量 @available(iOS 5.0, *) open func getWhite(_ white: UnsafeMutablePointer<CGFloat>?, alpha: UnsafeMutablePointer<CGFloat>?) -> Bool // 获取HSB颜色空间中组成颜色的组件 @available(iOS 5.0, *) open func getHue(_ hue: UnsafeMutablePointer<CGFloat>?, saturation: UnsafeMutablePointer<CGFloat>?, brightness: UnsafeMutablePointer<CGFloat>?, alpha: UnsafeMutablePointer<CGFloat>?) -> Bool // 获取RGB颜色空间中组成颜色的组件 @available(iOS 5.0, *) open func getRed(_ red: UnsafeMutablePointer<CGFloat>?, green: UnsafeMutablePointer<CGFloat>?, blue: UnsafeMutablePointer<CGFloat>?, alpha: UnsafeMutablePointer<CGFloat>?) -> Bool
测试代码如下:
// 测试获取color的相关信息 func testGetInfomationWithColor() { var r: CGFloat = 0; var g: CGFloat = 0; var b: CGFloat = 0; var a: CGFloat = 0; UIColor.red.getRed(&r, green: &g, blue: &b, alpha: &a); print("RGB分量---" + "r:" + String(describing: r) + " g:" + String(describing: g) + " b:" + String(describing: b) + " a:" + String(describing: a)); var hh: CGFloat = 0; var ss: CGFloat = 0; var bb: CGFloat = 0; var aa: CGFloat = 0; UIColor.red.getHue(&hh, saturation: &ss, brightness: &bb, alpha: &aa); print("HSB分量---" + "hh:" + String(describing: hh) + " ss:" + String(describing: ss) + " bb:" + String(describing: bb) + " aa:" + String(describing: aa)); var www: CGFloat = 0; var aaa: CGFloat = 0; UIColor.red.getWhite(&www, alpha: &aaa); print("灰度分量---" + "www:" + String(describing: www) + " aaa:" + String(describing: aaa)); print("cgcolor---" + String(describing: UIColor.red.cgColor)); print("cicolor---" + String(describing: UIColor.init(ciColor: CIColor.red()).ciColor)); }
测试结果:
RGB分量---r:1.0 g:0.0 b:0.0 a:1.0 HSB分量---hh:0.0 ss:1.0 bb:1.0 aa:1.0 灰度分量---www:0.509023487567902 aaa:1.0 cgcolor---<CGColor 0x6100000aa680> [<CGColorSpace 0x61000002f940> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 1 0 0 1 ) cicolor---(1 0 0 1)
注意:UIColor的CGColor总是有效的,不管它是通过CGColor,CIColor,还是其他方法创建的,CGColor属性都总是有效的;但是CIColor属性就不总是有效的,只有当UIColor是通过CIColor创建的时候,他才是有效的,否则访问该属性将会抛出异常
八、Color Literal
// 字面量颜色 不要直接调用 @nonobjc required public convenience init(colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float)
这个API,是Xcode提供的一个可视化颜色选择器,不需要直接调用,使用方法如下:
1、设置颜色的时候输入 color literal
会有智能提示如下:
2、回车后,会出现颜色选择界面
3、可以选择一个想要的颜色,还可以点击下方的 Other ,选颜色蜡笔或者直接输入颜色值。选完后在代码里就会有个小方块。里面填充的就是刚刚选的颜色,如下:
4、运行后结果如下:
5、实质上,小方块就是这个API的替代显示,复制整个函数代码粘贴如下:
// 测试字面量初始化方法 func testLiteralInit() { self.addImageView(color: #colorLiteral(red: 0.1215686277, green: 0.01176470611, blue: 0.4235294163, alpha: 1)); }
九、完毕
UIColor
这个类测试讲解到这里就结束了,在之后的时间里,我会将swift下的相关类依次整理一下,温故而知新!感兴趣的童鞋,可以关注我的 个人博客网站http://www.wanglongshuai.com 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
结网@改变世界的互联网产品经理
王坚 / 人民邮电出版社 / 2013-5-1 / 69.00元
《结网@改变世界的互联网产品经理(修订版)》以创建、发布、推广互联网产品为主线,描述了互联网产品经理的工作内容,以及应对每一部分工作所需的方法和工具。产品经理的工作是围绕用户及具体任务展开的,《结网@改变世界的互联网产品经理(修订版)》给出的丰富案例以及透彻的分析道出了从发现用户到最终满足用户这一过程背后的玄机。新版修改了之前版本中不成熟的地方,强化了章节之间的衔接,解决了前两版中部分章节过于孤立......一起来看看 《结网@改变世界的互联网产品经理》 这本书的介绍吧!