我通常使用 Swift 扩展在 iOS 上使用自定义 UIColors,但现在使用 iOS 11/Xcode 9,我们可以创建颜色集。我们如何使用它们?
更新 - 提示
正如@Cœur 所说,我们可以拖放颜色,并像 UIColor 对象一样使用它,一个可能的解决方案是将它用作扩展:
或作为常数:
现在我想知道我们是否可以像 UIImage 访问资产图像一样访问它们,例如:
UIImage(named: "image-name") -> UIColor(named: "color-name")
我通常使用 Swift 扩展在 iOS 上使用自定义 UIColors,但现在使用 iOS 11/Xcode 9,我们可以创建颜色集。我们如何使用它们?
更新 - 提示
正如@Cœur 所说,我们可以拖放颜色,并像 UIColor 对象一样使用它,一个可能的解决方案是将它用作扩展:
或作为常数:
现在我想知道我们是否可以像 UIImage 访问资产图像一样访问它们,例如:
UIImage(named: "image-name") -> UIColor(named: "color-name")
(对问题更新的简短回答:UIColor(named: "MyColor")Xcode 9.0 中有)
回答原来的问题:
查看源代码时,它将转换为颜色文字:
#colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)
你注意到红色、绿色和蓝色的值有什么不同吗?这是因为我使用 Color Space 定义了它们Display P3,但 colorLiteral 使用的是 Color Space sRGB。
你需要使用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)
将颜色集添加到资产目录,为其命名并在属性检查器中设置颜色,然后在代码中使用UIColor(named: "MyColor").
在资产目录查看器中,单击主面板右下角的加号按钮,然后选择新建颜色集

单击白色方块,然后选择属性检查器(右侧窗格中最右侧的图标)
从那里您可以命名并选择您的颜色。

要在您的代码中使用它,请使用UIColor(named: "MyColor"). 这将返回一个可选的,因此您需要在大多数情况下将其展开(这可能是少数可以接受强制展开的情况之一,因为您知道资产目录中存在颜色)。
您可以使用这种方式进行简单访问(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)
// iOS
let color = UIColor(named: "SillyBlue")
// macOS
let color = NSColor(named: "SillyBlue")
如果您在使用 Swift 包时遇到颜色加载延迟UIColor(named:):
上面的答案对于常规项目完全有效,但是如果您在 swift 包中使用资产,则在使用UIColor(named: "example_name"). 如果您使用UIColor(named: "background", in: Bundle.module, compatibleWith: .current)针对模块的重载,则颜色会立即加载,不会有任何延迟。
注意:我在 Xcode 12.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")
}