【问题标题】: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")

【问题讨论】:

    标签: swift uicolor asset-catalog ios11 xcode9-beta


    【解决方案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")

    回答原问题:

    1. 你创建你的颜色集

    1. 您在 sn-ps 中找到您的颜色,然后拖放它

    1. 查看源代码时,它将转换为颜色文字:

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

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

    【讨论】:

    • @elGeekalpha 将问题编辑为其他问题是一种不好的做法;见meta.stackoverflow.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") 调用它。

    完整说明

    1. 在资产目录查看器中,单击主面板右下角的加号按钮并选择New Color Set

    2. 单击白色方块,然后选择属性检查器(右侧窗格中最右侧的图标)

    3. 您可以从那里命名并选择您的颜色。

    4. 要在您的代码中使用它,请使用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")
          

          【讨论】:

            猜你喜欢
            • 2019-11-11
            • 2017-05-30
            • 1970-01-01
            • 2018-04-16
            • 2020-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多