iOS 11 与 Xcode 11 beta 的命名颜色问题

Issues with named colors on iOS 11 with Xcode 11 beta

我正在尝试在我的 iOS 应用程序中实现深色模式。为此,我需要使用命名颜色,但我 运行 遇到了一些麻烦。在明暗模式之间切换时,iOS 13 模拟器一切正常,并且 iOS 12 模拟器中的颜色也是正确的。当我尝试在 iOS 11 模拟器上 运行 我的应用程序时出现问题。我在情节提要中使用的任何命名颜色默认为颜色的深色版本,当我尝试在代码中访问命名颜色时,我得到 nil。只是想知道是否还有其他人运行进入这个

看来是苹果方面的问题。甚至 Xcode 11 GM seed 也有这个问题。人们正在苹果开发者论坛上讨论这个问题。

https://forums.developer.apple.com/thread/122053

苹果好像知道

引自 https://developer.apple.com/ios/submit/

Please note that apps built with Xcode 11 using named colors may experience lookup failures (with no value returned) when the app runs on iOS 11 or earlier. This will be fixed in a future Xcode update. To avoid this issue, raise the minimum deployment target to iOS 12 or later to submit to the App Store now, or rebuild with the next Xcode GM candidate seed when it’s available.

更新20190917

Build your apps using Xcode 11 GM seed 2, which includes SDKs for iOS 13, iPadOS, watchOS 6, tvOS 12, and macOS Catalina. Starting April, 2020, all iOS apps submitted to the App Store will need to be built with the iOS 13 SDK or later. They must also support the all-screen design of iPhone XS Max or the 12.9-inch iPad Pro (3rd generation), or later.

这是 Xcode 11 和 IOS 11 中的错误。 IOS 11

中命名颜色的两个问题
  1. UIColor 初始化方法 init?(named name: String) returns nil 在 IOS 11
  2. 故事板或 xib 文件中使用的命名颜色资源有时默认为深色版本。

这是暂时的解决方法,直到它在即将发布的 Xcode 版本中得到修复。

  1. 如果UIColor初始化方法init?(named name: String)returnsnil你需要为光模式提供回退颜色。

    let color = UIColor(named: "myColor") ?? UIColor.black // default color for IOS 11
    
  2. 故事板和 xib 文件的命名颜色问题,如果您在设置任何名称颜色后观察 xib 文件或故事板的变化,您会注意到有一个 namedColor xml 标记在 resources 选项卡下。对于每个 namedColor 都有后备颜色,后备颜色在 IOS 11 的情况下,因为命名颜色不起作用。您甚至可以在控制台中看到警告。

     <resources>
         <namedColor name="NavigationBar">
             <color red="0.2669999897480011" green="0.70999997854232788" blue="0.046999998390674591" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
         </namedColor>
     </resources>
    

    Xcode 11 中的错误是,如果您的 MacOS 外观设置为 Dark 并且它选择 light 颜色版本,则默认值设置为深色模式版本默认值,如果您的 MacOS 外观设置为 Light。 IOS 11 的解决方法。

    1. 您可以将您的 MacOS 外观设置为 Light。之后,您需要打开项目中的每个故事板或 xib 文件一次。打开它后,编辑器会自动选择颜色的 Light 版本,您可以在源代码管理中看到该文件已修改,默认值将是颜色资源的 Light 版本。请注意,每次更改颜色资产中的任何值时,都必须对所有使用该命名颜色的 xib 文件再次执行此操作。
    2. 第二个有点复杂,您需要编写一个脚本来解析项目的所有 xib 和故事板文件并更新默认的 RGBA 值。

更新 Xcode 版本 11.0 (11A420a)

对于有这个问题的和 Storyboards 的,我建议在你的配色方案中使用 "Any Appearance" 默认值 Light 模式 。 例如,对于深色,我有灰色背景,浅色为白色,字体是相反的,白色和深灰色。默认一切为浅色模式,IOS 会将其解释为浅色,您不会有任何问题。

如您在我的屏幕截图中所见,我的应用程序在 IOS 11 上正常运行。 如果我不这样做,可能我所有的字体都是白色的,用户根本看不到任何东西。

我强烈建议在单独的资产中添加所有颜色,任何添加的颜色都可以映射到新的系统颜色,这样它将自动处理 iOS 13 的浅色模式和深色模式颜色,并且它将采用iOS 12,11,... 的默认颜色

此外,您可以使用

在您的代码中调用它
UIColor(named: "systemBlue") ?? UIColor.blue