通过故事板命名颜色

Named colors via storyboard

对于我的 MacOS 应用程序,我创建了一个颜色资产目录。 我的项目的部署目标是 10.11。

当我在情节提要中设置颜色时,我可以从颜色资源中进行选择。但是当我尝试以编程方式设置其中一种命名颜色时,我需要将其包装在

if #available(OSX 10.13, *) {
   view.backgroundColor = NSColor(named: "someColor")
} else {
   // Fallback on earlier versions
}

原问题:

所以问题是为什么我在通过故事板选择这些颜色时没有收到任何警告?

我想我需要用自定义颜色替换它们,否则我的应用程序会在 OS < 10.13 时崩溃,但我希望故事板不会因为部署目标而让我选择这些颜色。 .

已编辑:

所以问题是当我通过 Storyboard 使用这些颜色时会发生什么? 它会使应用程序崩溃吗?或者故事板甚至可以处理 OS 版本 < 10.13 的命名颜色?因为我试图通过 Storyboard 使用命名的颜色,并且我将应用程序安装在 Mac 和 OS 10.12 上,并且该应用程序运行良好。所以我想知道这是什么原因..

P.S 这个问题也与 iOS 有关,其中命名颜色的最小版本是 iOS 11

不会使您的应用程序崩溃。使用资产目录中的颜色,您有两个选择:

  1. 仅将其与故事板一起使用。
  2. 使用 UIColor(named: <#String #>) 就像您在问题中尝试做的那样。

唯一的问题是 UIColor(named:) 在 iOS 11.0+ (See documentation)

中可用

因此,如果您想每次都使用它,您需要考虑回退到最旧的版本,而这可能不是您想要的。

但是在媒体库中 Xcode 中内置了另一个解决方案:

您可以从资产目录中拖放颜色,Xcode 将为您创建此颜色的参考,该颜色也适用于 iOS 10.0。

隐藏在这个颜色中的实际代码行是:

colorLiteral(red: 0.9411764706, green: 0.07843137255, blue: 0.07843137255, alpha: 1)

因此您可以编写一个脚本来为您生成这种颜色。

前段时间我需要类似的解决方案,所以我写了一个脚本来扫描我的整个项目以查找资产目录,并在其中找到一个颜色集并创建 UIColor 包含资产中所有颜色的扩展:

您可以在这里找到它:https://github.com/JakubMazur/SwiftColorsGenerator and it's available to use through Marathon (https://github.com/JohnSundell/Marathon)

通过使用 Jakub 的方法,颜色将不适用于不同的外观(light/dark 模式)。

像这样创建颜色对我有用。

extension UIColor {
    static var testColor: UIColor = {
        return UIColor(named: "TestColor", in: Bundle(for: AppDelegate.self), compatibleWith: nil)!
    }()
}