95

我通常使用 Swift 扩展在 iOS 上使用自定义 UIColors,但现在使用 iOS 11/Xcode 9,我们可以创建颜色集。我们如何使用它们?

更新 - 提示

正如@Cœur 所说,我们可以拖放颜色,并像 UIColor 对象一样使用它,一个可能的解决方案是将它用作扩展:

UIColor 作为扩展

或作为常数:

UIColor 作为常量

现在我想知道我们是否可以像 UIImage 访问资产图像一样访问它们,例如:

UIImage(named: "image-name") -> UIColor(named: "color-name")
4

11 回答 11

111
UIColor(named: "myColor") 

来源:WWDC 2017 Session 237 —— MapKit 的新功能


警告:您的项目的部署目标需要设置为 iOS 11.0。

于 2017-06-09T16:28:24.103 回答
48

(对问题更新的简短回答:UIColor(named: "MyColor")Xcode 9.0 中有)

回答原来的问题:

  1. 你创建你的颜色集

在此处输入图像描述

  1. 你在片段中找到你的颜色,然后拖放它

在此处输入图像描述

  1. 查看源代码时,它将转换为颜色文字:

    #colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)

你注意到红色、绿色和蓝色的值有什么不同吗?这是因为我使用 Color Space 定义了它们Display P3,但 colorLiteral 使用的是 Color Space sRGB

于 2017-06-08T06:34:21.217 回答
35

在 Xcode 11 中按 command + shift + L ,它将打开一个片段,选择最后一个,就像我在图像拖放中显示的那样。

在此处输入图像描述

于 2019-10-23T17:15:13.743 回答
30

你需要使用UIColor(named: "appBlue").

您可以在 UIColor 扩展中创建一个函数以进行简单访问。

enum AssetsColor {
   case yellow
   case black
   case blue
   case gray
   case green
   case lightGray
   case separatorColor
   case red
}

extension UIColor {

    static func appColor(_ name: AssetsColor) -> UIColor? {
        switch name {
        case .yellow:
            return UIColor(named: "appYellow")
        case .black:
            return UIColor(named: "appBlack")
        case .blue:
            return UIColor(named: "appBlue")
        case .gray:
            return UIColor(named: "appGray")
        case .lightGray:
            return UIColor(named: "appLightGray")
        case .red:
            return UIColor(named: "appRed")
        case .separatorColor:
            return UIColor(named: "appSeparatorColor")
        case .green:
            return UIColor(named: "appGreen") 
        }
    }
}

你可以像这样使用它:

userNameTextField.textColor = UIColor.appColor(.gray)
于 2018-11-30T08:03:09.573 回答
30

精简版

将颜色集添加到资产目录,为其命名并在属性检查器中设置颜色,然后在代码中使用UIColor(named: "MyColor").

完整说明

  1. 在资产目录查看器中,单击主面板右下角的加号按钮,然后选择新建颜色集

    新颜色设置菜单

  2. 单击白色方块,然后选择属性检查器(右侧窗格中最右侧的图标)

  3. 从那里您可以命名并选择您的颜色。

    在此处输入图像描述

  4. 要在您的代码中使用它,请使用UIColor(named: "MyColor"). 这将返回一个可选的,因此您需要在大多数情况下将其展开(这可能是少数可以接受强制展开的情况之一,因为您知道资产目录中存在颜色)。

于 2017-08-30T21:00:28.740 回答
24

您可以使用这种方式进行简单访问(swift 4 & swift 5)

enum AssetsColor: String {
    case backgroundGray
    case blue
    case colorAccent
    case colorPrimary
    case darkBlue
    case yellow
}

extension UIColor {
    static func appColor(_ name: AssetsColor) -> UIColor? {
         return UIColor(named: name.rawValue)
    }
}

使用:

userNameTextField.textColor = UIColor.appColor(.blue)
于 2019-07-12T21:09:39.960 回答
9
 // iOS
 let color = UIColor(named: "SillyBlue")

 // macOS
 let color = NSColor(named: "SillyBlue")
于 2017-11-25T10:48:40.673 回答
7

对于您的问题,如果您可以使用文字访问像图像这样的颜色资产,从 Xcode 10.2 开始,您可以输入colorliteral,然后您可以在资产管理器下选择要使用的颜色。

示例片段

于 2019-11-12T08:44:44.040 回答
3

如果您在使用 Swift 包时遇到颜色加载延迟UIColor(named:)

上面的答案对于常规项目完全有效,但是如果您在 swift 包中使用资产,则在使用UIColor(named: "example_name"). 如果您使用UIColor(named: "background", in: Bundle.module, compatibleWith: .current)针对模块的重载,则颜色会立即加载,不会有任何延迟。

注意:我在 Xcode 12.1 上遇到过这种情况。

于 2020-11-10T11:25:40.490 回答
1

为 swiftUI 创建一个类并将其命名: Color+extansion 和 extend Color :

import SwiftUI

extension Color {
    static let background = Color("BackgroundColor")
    static let whiteColor = Color("WhiteColor")
    static let blackColor = Color("BackgroundColor")
    static let primery = Color("PrimeryColor")
    static let secondaryColor = Color("SecondaryColor")    
}
于 2021-09-06T16:07:15.570 回答
0

或者,使用 SwiftUI结构,您可以简单地使用资产名称Color调用初始化程序:

Color("background")
于 2021-09-06T15:30:37.093 回答