我们如何使用资产目录颜色集?
Posted
技术标签:
【中文标题】我们如何使用资产目录颜色集?【英文标题】:How can we use Assets Catalog Color Sets? 【发布时间】:2017-11-07 22:09:36 【问题描述】:我通常使用 Swift 扩展在 ios 上使用自定义 UIColors,但现在使用 iOS 11/Xcode 9 我们可以创建颜色集。我们如何使用它们?
更新 - 提示
正如@Cœur 所说,我们可以拖放颜色,并像 UIColor 对象一样使用它,并且可能的解决方案是将其用作扩展:
或者作为一个常数:
现在我想知道我们是否可以像 UIImage 访问资产图像一样访问它们,例如:
UIImage(named: "image-name") -> UIColor(named: "color-name")
【问题讨论】:
【参考方案1】:UIColor(named: "myColor")
来源:WWDC 2017 Session 237 —— What's New in MapKit
警告:您的项目的部署目标需要设置为 iOS 11.0。
【讨论】:
这需要部署目标 = 11.0。【参考方案2】:(问题更新的简短回答:Xcode 9.0 中有UIColor(named: "MyColor")
)
回答原问题:
-
你创建你的颜色集
-
您在 sn-ps 中找到您的颜色,然后拖放它
查看源代码时,它将转换为颜色文字:
#colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)
你注意到红色、绿色和蓝色的值有什么不同吗?这是因为我使用颜色空间 Display P3
定义了它们,但 colorLiteral 使用的是颜色空间 sRGB
。
【讨论】:
@elGeekalpha 将问题编辑为其他问题是一种不好的做法;见meta.***.com/questions/350309/…或meta.stackexchange.com/questions/43478/… 我没有改变问题,我只是更好地指定了我想要的实现:如何使用它们,但就像我们通常使用图像资产一样,因为拖放只是一种替代解决方案。很抱歉给您带来不便。 Xcode 没有添加UIColor(named:)
,它是从 iOS 11 开始内置于 iOS 的 UIKit 的一部分。这似乎是一个微妙的点,但它很重要。 Xcode 无法向 UIKit 添加方法。【参考方案3】:
在 Xcode 11 中按 command + shift + L ,它将打开一个 sn-p ,选择最后一个,就像我在图像拖放中显示的那样。
【讨论】:
荣誉。从来没有想过要检查这个菜单。 这是添加颜色文字的好方法,但如果我们需要使用资产稍微更改颜色,更改不会反映在拖动文字的代码中。因此,我仍在寻找使用资产名称并处理 UIColor 的可选返回类型的解决方案。 添加颜色的完美方式【参考方案4】:短版
将颜色集添加到资产目录,为其命名并在属性检查器中设置颜色,然后在代码中使用UIColor(named: "MyColor")
调用它。
完整说明
在资产目录查看器中,单击主面板右下角的加号按钮并选择New Color Set
单击白色方块,然后选择属性检查器(右侧窗格中最右侧的图标)
您可以从那里命名并选择您的颜色。
要在您的代码中使用它,请使用UIColor(named: "MyColor")
调用它。这将返回一个可选项,因此在大多数情况下您需要将其解包(这可能是少数可以接受强制解包的情况之一,因为您知道资产目录中存在该颜色)。
【讨论】:
这需要部署目标 = 11.0。 我如何在 iOS 中做到这一点 好答案。我希望 iOS 能够像 android 使用 R.color.myColor 一样编译这些资产。新的 Colors.xcassets 方法肯定更好,但如果您输入错误的颜色名称、删除颜色而没有找到它使用的所有点等,仍然会导致运行时错误。似乎应该在编译时捕获一些东西,而不是而不是在运行时导致崩溃(我知道你可以将它视为可选而不是强制打开它,但这会增加更多的复杂性......那么有什么意义呢?!):) 在 iOS if #available(iOS 11.0, *) else //Fallback on earlier versions 等设置。【参考方案5】:您需要使用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 您可以为enum AssetsColor: String
添加原始值并提供名称作为原始值(例如case yellow = "appYellow"
),这样您就不需要switch
,而只需UIColor(named: name.rawValue)
【参考方案6】:
您可以使用这种方式进行简单的访问(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)
【讨论】:
【参考方案7】: // iOS
let color = UIColor(named: "SillyBlue")
// macOS
let color = NSColor(named: "SillyBlue")
【讨论】:
该 URL 与资产目录颜色、颜色或 iOS 无关。【参考方案8】:对于您的问题,如果您可以使用文字访问图像等颜色资产,从 Xcode 10.2 开始,您可以输入 colorliteral
,然后您可以在资产管理器下选择您想要使用的颜色。
【讨论】:
您好,只需在您的编辑器中输入color literal
。例如:label.textColor = 颜色文字
如何在 Xcode 12.5 中访问颜色资源?我双击创建的颜色方块“Color Literal”,然后在新弹出窗口中单击“Other”,但没有一个选项卡显示颜色资源,甚至“Color Palettes”的 5 个下拉选项都没有。【参考方案9】:
如果您在使用 UIColor(named:)
时遇到 Swift 包中的颜色加载延迟:
上述答案对于常规项目完全有效,但如果您在 swift 包中使用资产,则在使用 UIColor(named: "example_name")
时加载颜色时会出现延迟。如果您使用以模块为目标的UIColor(named: "background", in: Bundle.module, compatibleWith: .current)
重载,则颜色会立即加载,不会有任何延迟。
注意:我在 Xcode 12.1 上遇到过这种情况。
【讨论】:
【参考方案10】:为 swiftUI 创建一个类并将其命名为:颜色+扩展和扩展颜色:
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")
【讨论】:
【参考方案11】:或者,使用 SwiftUI Color
结构,您可以简单地使用资产名称调用 initializer:
Color("background")
【讨论】:
以上是关于我们如何使用资产目录颜色集?的主要内容,如果未能解决你的问题,请参考以下文章