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

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")

【讨论】:

以上是关于我们如何使用资产目录颜色集?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从10.11中的资产目录中获取颜色?

如何在 Xcode 中的 pdf 资产上设置色调颜色?

可以在 webview 中使用资产目录中的命名颜色吗?

在 Xcode 6 中创建新的资产目录/图像集

如何告诉资产目录 (.xcassets) 对多个图像井使用相同的图像?

除了启动图像和应用程序图标之外,我可以使用资产目录来管理图像吗?