我们如何使用资产目录颜色集?


77

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

更新-提示

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

UIColor作为扩展

或作为常量:

UIColor作为常量

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

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

Answers:



46

(问题更新的简短答案: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


1
@elGeekalpha将问题编辑为另一个问题是不明智的做法;看到meta.stackoverflow.com/questions/350309/...meta.stackexchange.com/questions/43478/...
心教堂

1
我没有改变问题,我只是更好地指定了我想要的实现:如何使用它们,但是就像我们通常使用Images Assets一样,拖放只是一种替代解决方案。抱歉给你带来不便。
elGeekalpha

4
Xcode没有添加UIColor(named:),它是UIKit的一部分,UIKit是从iOS 11开始内置于iOS的。它可能看起来很微妙,但很重要。Xcode无法将方法添加到UIKit。
汤姆·哈灵顿

28

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

在此处输入图片说明


3
荣誉 从来没有想过要检查此菜单。
内森·霍瑟尔顿

3
这是添加颜色文字的一种好方法,但是如果我们需要使用资产来稍微更改颜色,则更改将不会反映在拖动文字的代码中。因此,我仍在寻找使用资产名称代替并处理UIColor的可选返回类型的解决方案。
库舒尔·阿肖克

添加颜色的完美方式
Parth Patel

26

简洁版本

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

完整说明

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

    新颜色设置菜单

  2. 单击白色正方形,然后选择“属性”检查器(右窗格中最右边的图标)

  3. 在这里,您可以命名并选择颜色。

    在此处输入图片说明

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


4
这将需要部署目标= 11.0。
Chintan Shah's

8
我该如何在iOS <= 10
ffleandro '18

4
好答案。我希望iOS可以使这些资产与Android用R.color.myColor相同的方式进行编译。新的Colors.xcassets方法绝对更好,但是如果您输错颜色名称,删除颜色而未找到所有使用位置,则仍然会出现运行时错误,这似乎是应该在编译时捕获的。会在运行时导致崩溃(我知道您可以将其视为可选的,而不必强行打开包装,但这会增加更多的复杂性……那么那是什么意思呢
!!

23

您需要使用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)

最低SDK包括:iOS 11.0 +,Mac Catalyst 13.0 +,tvOS 11.0 +,watchOS 4.0
mgyky

1
您可以添加的原始值enum AssetsColor: String并提供名称作为原始值(例如case yellow = "appYellow"),因此您不需要switch,而只需UIColor(named: name.rawValue)
Arkadii

12

您可以使用这种方式进行简单访问(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)
    }
}

8
 // iOS
 let color = UIColor(named: "SillyBlue")

 // macOS
 let color = NSColor(named: "SillyBlue")

5
该URL与资产目录的颜色或颜色或iOS无关。
汤姆·哈灵顿'18

6

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

样本片段


1
您好,只需color literal 在编辑器中输入。例如:label.textColor =颜色文字
Muchicole

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.