iOS-使用自定义颜色扩展UIColor

然后,我将打开一个颜色选择器以获取所选颜色的RGB值。 最后,我将打开Xcode并使用这些值创建颜色🙄无聊吗?

这种方法非常令人沮丧,因为每次:

  • 我必须打开Safari并搜索图片
  • 打开拾色器
  • 用RGB值创建颜色并添加255的丑陋除法

我需要的是像Swift 3之前一样的UIColor.redColor()和Swift 3之前的UIColor.red这样简单的东西。

我想出了一个非常简单的解决方案:使用自定义结构扩展UIColor! 让我们跳进去吧! 🙃

第1步-创建一个新的iOS项目

创建一个新项目,这里没有新内容。 选择Swift作为语言,您就完成了。

步骤2 —阅读具有十六进制值的颜色-第1部分

在大多数情况下,指定颜色时,与具有颜色的十六进制值相反,写入RGB值很无聊。 给定十六进制值,任何本机UIColor初始化都不能给出颜色,因此我们必须编写一个。

第一步是从十六进制获取RGB值。 这需要一点点按位操作,如果需要,您可以跳过下一部分,说明我们将如何进行。

a什么是十六进制值?

我们如何使用它并提取有趣的信息?

步骤3(可选)—让我们玩十六进制

例如,在上面的纯色图像中,我最喜欢的是Terra Cotta,其十六进制值为0xE66B5B (请注意,第一个字符为零)。 我们想从此十六进制提取RGB值,但是为此,我们必须掌握并了解什么是十六进制值以及如何生成它。

在底层,十六进制值只是一个整数。 您可以通过打开Playground来快速检查以下内容:

现在,要获取十六进制值的红色部分,我们向右移动,但是有多少位? 🤔

我们看到我们必须摆脱E6右边的4个十六进制值,即蓝色和绿色,即6B5B ,每个值编码为4位,共16位。

然后,我们以十六进制形式将其移位16位:

因为我们只想选择最后两个十六进制值(6和B),所以我们将应用以下掩码0xFF:

现在,&运算符将逐步应用:

  • 1&1 = 1
  • 1&0 = 0
  • 0&1 = 0
  • 0&0 = 0

基本上,当我们将遮罩应用于另一个值时,它将选择遮罩中为1的所有内容,并将其他所有内容为0。

如果我们回到所需的位置,则在平移和&操作后,我们最终选择了所需的零件6B

(0xE66B5B >> 8)&0xFF = 0x6B

要隔离蓝色分量,我们不需要移动,我们只需要起始表达式的最右边部分。 我们知道该怎么做:&!

(0xE66B5B)&0xFF = 0x5B

👮现在,为了安全起见,让我们回到红色组件的选择。 想象一下,作为输入,我们给出一个十六进制数,该十六进制数具有6个以上的十六进制数字,这将输出大于255的东西,因为我们只是移位而未选择任何东西。 为避免这种情况,我们只需要像对绿色和蓝色那样添加一个选择步骤,以确保选择正确范围内的内容:

(0xE66B5B >> 16)&0xFF = 0xE6

🤓总结一下:

第4步-创建具有RGB值的颜色

创建一个名为UIColor + Hex的新Swift文件。 当我们要使用UIColor时,我们必须用import UIKit替换import Foundation 。 顺便说一句,编写两个导入都将成为冗余导入,因为UIKit已经导入了Foundation。

现在我们已经隔离了红色,绿色和蓝色,我们可以使用这些值创建颜色,因为UIColor已经具有执行此操作的init: init(red:green:blue:alpha)

尽管如此,我们可以添加一个方便的初始化:

  • 使我们能够创建颜色而无需指定alpha
  • 检查值是否在合法范围内[0,255]

使用assert这非常简单。 🤓请记住,断言仅影响调试模式,而不影响省略断言的释放模式。 在这里使用assert并不是强制性的,因为创建一个颜色大于255的颜色不会触发崩溃,但是该颜色只会被调低到255。

首先,在我们新创建的文件中创建UIColor的扩展,然后在我们的方便初始化中,如下所示:

请注意,我们使用的是便捷初始化,因为便捷初始化程序是用于简化初始化的初始化程序:然后,我们必须最终调用指定的初始化程序,此处为init(red:green:blue:alpha)

步骤5 —阅读具有十六进制值的颜色—第2部分

既然我们可以方便地使用RGB创建颜色,并且如第3部分所述,我们可以从十六进制提取RGB值,那么事情就很简单了。 我们只需要添加我们方便的init即可创建给定十六进制的UIColor。

例子🤓

如果我想根据十六进制创建Terra Terra颜色,则只需执行以下操作:

容易吧?

第6步—扩展UIColor以添加自定义结构

最后,我们添加自定义颜色的有趣部分colors

创建一个名为UIColor + FlatColors.swift的新Swift文件。 像我们之前所做的那样,用import UIKit替换import Foundation

扩展类型时,我们可以轻松地向它们添加结构。 在这里,我们将按颜色划分。 我们可以创建一个包含所有纯色的巨大结构,也可以在父结构内部创建几个结构,这些结构可以更轻松地使用,如下所示。

现在,我们要在每个结构内部添加颜色,如示例第5部分所示,这是一个主要区别。 由于属性属于类而不是类的实例,因此我们必须添加static关键字。 然后,我们可以填充之前建立的物体,根据我的感觉大致将颜色分开:

最后一步-试试吧!

现在,在您的项目的任何Swift文件中,您都可以使用一条可爱的小行快速创建颜色:

那不是很棒吗? 😜