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

107

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

更新 - 提示

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

UIColor as an extension

或者作为一个常数:

UIColor as a constant

现在我想知道是否可以像访问Asset Image那样访问它们,例如UIImage访问Asset Image:

UIImage(named: "image-name") -> UIColor(named: "color-name")
12个回答

126

8
需要部署目标为11.0版本。 - Ricardo Mutti

49
在Xcode 11中,按下command + shift + L,它将打开一个代码片段,选择最后一个像我展示的那样拖放即可。

enter image description here


6
谢谢夸奖。我从来没想过会查看这个菜单。 - Nathan Hosselton
5
这是一种不错的添加颜色直接量的方式,但如果我们需要稍微改变使用资源文件的颜色,那么在文字代码中拖曳直接量的地方这些更改将不会反映出来。因此,我仍在寻找使用资源文件名称,并处理UIColor可选返回类型的解决方案。 - Kushal Ashok
完美的添加颜色方式 - Parth Patel
非常实用的小提示,谢谢! - fadecutmike
那么使用资源目录的意义是什么呢?你不如直接在代码中插入文字,因为这样做并不能将颜色与资源目录关联起来,只是粘贴了一个快照。试着在资源目录中更改颜色,你会发现你的颜色并没有改变。 - undefined

48

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

回答原问题:

  1. 创建颜色集合

enter image description here

  1. 在片段中找到颜色,然后将其拖放

enter image description here

  1. 在查看源代码时,它会转换为颜色文字字面量:

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

你注意到红、绿和蓝的值不同吗?这是因为我使用了颜色空间 Display P3 来定义它们,但颜色文字字面量使用的是颜色空间 sRGB


1
@elGeekalpha,将问题编辑为不同的问题是一种不好的做法;请参阅https://meta.stackoverflow.com/questions/350309/should-i-edit-my-answer-when-the-asker-edits-the-question或https://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions。 - Cœur
1
我没有改变问题,我只是更好地指定了我想要的实现方式:如何使用它们,但像我们通常使用图像资源一样,因为拖放只是一种替代解决方案。对于不便之处,我感到抱歉。 - elGeekalpha
4
Xcode没有添加UIColor(named:),它是UIKit的一部分,从iOS 11开始内置于iOS中。这可能看起来是一个微小的点,但却很重要。Xcode无法向UIKit添加方法。 - Tom Harrington

35

简略版

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

完整说明

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

    New Color Set menu

  2. 点击白色正方形,选择属性检查器(在右侧窗格中最右边的图标)

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

    enter image description here

  4. 在你的代码中使用UIColor(named: "MyColor")来调用它。这将返回一个可选值,所以在大多数情况下需要解包它(考虑到你知道颜色存在于你的资产目录中,这可能是少数几种情况之一,可以使用强制解包)。


4
需要设置 Deployment Target = 11.0。 - Chintan Shah
9
我可以翻译,如下所示:如何在 iOS <= 10 上执行此操作? - ffleandro
7
回答不错。我希望iOS能够像Android的R.color.myColor一样,使这些资源可以编译到同一个文件中。新的Colors.xcassets方法肯定更好,但如果您拼错颜色名称、删除未使用完毕的颜色等,仍然会引起运行时错误。这似乎应该在编译时被发现,而不是在运行时导致崩溃(我知道您可以将其视为可选项并且不强制解包它,但那样会增加更多的复杂性...那又有什么意义呢?!) :) - wildcat12
在 iOS < 11.0 中,你需要使用 if #available(iOS 11.0, *) { } else { //Fallback on earlier versions } 等设置。 - Ben

34

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

1
最低SDK版本要求为:iOS 11.0+,Mac Catalyst 13.0+,tvOS 11.0+,watchOS 4.0+。 - mgyky
4
您可以为 enum AssetsColor: String 添加原始值,并将名称作为原始值提供(例如 case yellow = "appYellow"),这样您就不需要使用 switch 语句,只需使用 UIColor(named: name.rawValue) - Arkadii
你如何解决这个警告 Value of optional type 'UIColor?' must be unwrapped to a value of type 'UIColor',针对这些可选的返回类型 UIColor??我们可以提供什么默认值或者最好的处理方式是什么? - Tejas

30

您可以使用此方法简单地访问(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)

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

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

5
那个URL与资源目录颜色、颜色或iOS无关。 - Tom Harrington

7

关于您的问题,如果您想使用文字方式访问颜色资源(例如图像),从Xcode 10.2开始,您可以键入colorliteral,然后选择您希望使用的在资产管理器中的颜色。

示例代码片段


1
嗨,只需在您的编辑器中键入“颜色文字”,例如:label.textColor = 颜色文字。 - Muchicole
你如何在Xcode 12.5中访问颜色资源?我双击了创建的“Color Literal”颜色正方形,然后在新的弹出窗口中点击了“其他”,但是没有一个选项卡显示颜色资源,甚至没有“Color Palettes”的5个下拉选项。 - Neph

3

您可以使用功能创建扩展以从资产中取消包装颜色,并将其与应用程序中的每个颜色一起使用。

extension UIColor {
    static var someColor: UIColor {
        return UIColor.color(name: "SomeColor")
    }

    private static func color(name: String) -> UIColor {
        guard let color = UIColor(named: name) else {
            return .black
        }
        return color
    }
}

使用示例:

UIColor.someColor

或者

someLabel.textColor = .someColor

3

为了在SwiftUI中创建一个类,可以将其命名为:Color+extansion并扩展 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")    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接