Swift 如何使用资源目录颜色集?

Swift 如何使用资源目录颜色集?,swift,uicolor,asset-catalog,ios11,xcode9-beta,Swift,Uicolor,Asset Catalog,Ios11,Xcode9 Beta,我通常在使用Swift扩展的iOS上使用自定义UIColor,但现在使用iOS 11/Xcode 9,我们可以创建颜色集。我们如何使用它们 更新-提示 正如@Cœur所说的,我们可以拖放de color,并将其用作UIColor对象,可能的解决方案是将其用作扩展: 或作为常数: 现在我想知道我们是否可以像访问资产映像一样访问它们,比如: UIImage(named: "image-name") -> UIColor(named: "color-name") 更新问题的简短回答:Xcod

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

更新-提示

正如@Cœur所说的,我们可以拖放de color,并将其用作UIColor对象,可能的解决方案是将其用作扩展:

或作为常数:

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

UIImage(named: "image-name") -> UIColor(named: "color-name")
更新问题的简短回答:Xcode 9.0中有

回答原问题:

创建颜色集 您可以在代码片段中找到您的颜色,然后拖放它 查看源代码时,它将转换为颜色文字:

彩色红:0,绿:0.6378085017,蓝:0.8846047521,阿尔法:1

您注意到红色、绿色和蓝色的值是如何不同的吗?这是因为我使用颜色空间显示P3定义了它们,但colorLiteral使用的是颜色空间sRGB

资料来源:

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

Short Version 将颜色集添加到资源目录中,命名它并在属性检查器中设置颜色,然后在代码中使用UIColorName:MyColor调用它

完整说明 在“资源目录查看器”中,单击主面板右下角的加号按钮,然后选择“新建颜色集”

单击白色正方形,然后选择右侧窗格中最右侧的属性检查器图标

从那里你可以命名和选择你的颜色

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

你需要使用

您可以在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)

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

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


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


如果您在使用UIColorName:时在Swift包中加载颜色时遇到延迟:

上述答案对于常规项目完全有效,但如果您在swift包中使用资产,则在使用UIColorName:example_name加载颜色时会出现延迟。如果使用UIColornamed:background,in:Bundle.module,compatibleWith:。当前针对模块的重载,则颜色会立即加载,不会有任何延迟


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

@elGeekalpha将问题编辑为其他问题是一种不好的做法;看,或者我没有改变这个问题,我只是指定了更好的实现:我如何使用它们,但就像我们通常使用图像资产一样,因为拖放只是一种替代解决方案。很抱歉给您带来不便。Xcode没有添加UIColorName:,它是UIKit的一部分,从iOS 11开始内置到iOS中。这似乎是一个微妙的问题,但它很重要。Xcode无法将方法添加到UIKit。这将要求部署目标=11.0。如何在iOS中执行此操作?答案很好。我希望iOS能让这些资产成为你可以编译的东西,就像Android使用R.color.myColor一样。新的Colors.xcasets方法无疑更好,但如果您键入错误的颜色名称,删除颜色而没有找到所使用的所有斑点,仍然会导致运行时错误,诸如此类的东西似乎应该在编译时捕获,而不是在运行时导致崩溃。我知道,您可以将其视为可选的,而不是强制展开,但这会增加更多的复杂性……那么,重点是什么呢在iOS<11.0中,您需要使用if availableiOS 11.0、*{}else{//Fallback on Previous versions}等设置。这将需要部署目标=11.0。该URL与资产目录颜色或iOS无关。只需在编辑器中键入颜色文字即可。例如:label.textColor=color literal如何访问Xcode 12.5中的颜色资源?我双击了创建的颜色方块颜色文字,然后在新的弹出窗口中单击了其他,但没有一个选项卡显示颜色资源,甚至调色板的5个下拉选项也没有显示。从来没有想过要检查这个菜单。这是一个很好的添加颜色文字的方法,但是如果我们需要使用资源稍微更改颜色,更改将不会反映在拖动文字的代码中。因此,我仍然在寻找使用资产名称的解决方案,并处理可选的返回类型UIColor vOS 11.0+,watchOS 4.0您可以为enum AssetColor:String添加原始值,并将名称作为原始值提供,例如case yellow=appYellow,这样您就不需要开关,只需UIColorName:name.rawValue即可
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)