UIColor(named: "myColor")
来源: WWDC 2017 Session 237 —— MapKit 的新特性
注意:您的项目的部署目标(Deployment Target)需要设置为 iOS 11.0。
(问题更新的简短回答:Xcode 9.0 中有 UIColor(named: "MyColor")
)。
回答原问题:
在查看源代码时,它会转换为颜色文字字面量:
#colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)
你注意到红、绿和蓝的值不同吗?这是因为我使用了颜色空间 Display P3
来定义它们,但颜色文字字面量使用的是颜色空间 sRGB
。
UIColor(named:)
,它是UIKit的一部分,从iOS 11开始内置于iOS中。这可能看起来是一个微小的点,但却很重要。Xcode无法向UIKit添加方法。 - Tom Harrington在资产目录中添加一个颜色集,命名并在属性检查器中设置你的颜色,然后在你的代码中使用UIColor(named: "MyColor")
调用它。
在资产目录查看器中,单击主面板右下角的加号,选择新颜色集
点击白色正方形,选择属性检查器(在右侧窗格中最右边的图标)
从那里可以命名和选择你的颜色。
在你的代码中使用UIColor(named: "MyColor")
来调用它。这将返回一个可选值,所以在大多数情况下需要解包它(考虑到你知道颜色存在于你的资产目录中,这可能是少数几种情况之一,可以使用强制解包)。
if #available(iOS 11.0, *) { } else { //Fallback on earlier versions }
等设置。 - Ben你需要使用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)
enum AssetsColor: String
添加原始值,并将名称作为原始值提供(例如 case yellow = "appYellow"
),这样您就不需要使用 switch
语句,只需使用 UIColor(named: name.rawValue)
。 - ArkadiiValue of optional type 'UIColor?' must be unwrapped to a value of type 'UIColor'
,针对这些可选的返回类型 UIColor?
?我们可以提供什么默认值或者最好的处理方式是什么? - Tejas您可以使用此方法简单地访问(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")
您可以使用功能创建扩展以从资产中取消包装颜色,并将其与应用程序中的每个颜色一起使用。
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
为了在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")
}