热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玩转swiftUIKit之UIColor

前言UIColor类是UIKit中用来存储颜色数据的一个类,想要清晰的了解这个类中的相关属性、方法,则需要先了解一个名词:颜色空间。不同的

前言

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);// 颜色空间:UIExtendedSRGBColorSpaceself.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

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() {// 颜色空间:UIExtendedGrayColorSpaceself.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);// 颜色空间:UIExtendedSRGBColorSpaceself.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

2

三、在特定颜色空间中创建自定义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 -> UIColorself.addImageView(color: UIColor.init(cgColor: CGColor.init(colorSpace: CGColorSpaceCreateDeviceCMYK(), components: [1,1,0,0,1])!));// CIColor -> UIColorself.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

4

五、由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

5

建议:在实际项目中尽量避免使用这种方式加载加图片,因为这种加载方式会比直接加载图片占用更大的内存。

六、设置图形上下文的绘图颜色

// 同时设置画笔颜色和填充颜色
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();
}

测试结果:

6

七、检索颜色信息

// 获取与此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?, alpha: UnsafeMutablePointer?) -> Bool// 获取HSB颜色空间中组成颜色的组件
@available(iOS 5.0, *)
open func getHue(_ hue: UnsafeMutablePointer?, saturation: UnsafeMutablePointer?, brightness: UnsafeMutablePointer?, alpha: UnsafeMutablePointer?) -> Bool// 获取RGB颜色空间中组成颜色的组件
@available(iOS 5.0, *)
open func getRed(_ red: UnsafeMutablePointer?, green: UnsafeMutablePointer?, blue: UnsafeMutablePointer?, alpha: UnsafeMutablePointer?) -> 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--- [ (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。



推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示.并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效.出现以下情况:Failedtolocateorgene ... [详细]
  • iOS Xcode汇编模式切换的方法介绍
    一、概念 1.汇编指令:模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码,操作 ... [详细]
  • 开发笔记:小白python机器学习之路——支持向量机
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白python机器学习之路——支持向量机相关的知识,希望对你有一定的参考价值。支持 ... [详细]
author-avatar
kyf召世星bdc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有