【问题标题】:Issues with named colors on iOS 11 with Xcode 11 beta带有 Xcode 11 beta 的 iOS 11 上的命名颜色问题
【发布时间】:2019-08-20 19:14:53
【问题描述】:

我正在尝试在我的 iOS 应用中实现暗模式。我需要使用命名颜色才能做到这一点,但我遇到了一些障碍。在浅色和深色模式之间切换时,在 iOS 13 模拟器上一切正常,在 iOS 12 模拟器中颜色也正确。当我尝试在 iOS 11 模拟器上运行我的应用程序时,会出现此问题。我在情节提要中使用的任何命名颜色都默认为颜色的深色版本,当我尝试在代码中访问命名颜色时,我得到 nil。只是想知道是否有其他人遇到过这种情况

【问题讨论】:

  • “我需要使用命名颜色才能做到这一点”你可以在代码中配置颜色。这样所有系统都会做正确的事情。
  • 这不是一个非常可行的解决方案,因为当我可以在故事板编辑器中轻松设置数百个视图的颜色时,我必须在代码中设置它们的颜色
  • 是的,这很痛苦。但听起来你不会向后兼容 iOS 11。提交一个错误。

标签: ios xcode ios13 xcode11


【解决方案1】:

这是带有 IOS 11 的 Xcode 11 中的错误。IOS 11 中命名颜色的两个问题

  1. UIColorinit方法init?(named name: String)在IOS 11中返回nil
  2. 故事板或 xib 文件中使用的命名颜色资源有时默认为深色版本。

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

  1. 如果UIColor init 方法init?(named name: String) 返回nil,则需要为灯光模式提供备用颜色。

    let color = UIColor(named: "myColor") ?? UIColor.black // default color for IOS 11
    
  2. 故事板和 xib 文件的命名颜色问题,如果您在设置任何名称颜色后观察 xib 文件或故事板的变化,您会注意到 resources 选项卡下有一个 namedColor xml 标签。对于每个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,则默认值设置为暗模式版本,并且如果您的 MacOS 外观设置为 @,它会选择 light 颜色版本作为默认值987654336@。为 IOS 11 解决此问题的解决方法。

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

【讨论】:

  • 不幸的是,它不适用于情节提要用户。
  • @lambdapool 它确实适用于我的故事板。但此问题已修复 Xcode 11 GM Seed 2 并且公共 Xcode 11 更新可用。 Juat 更新您的 Xcode,一切顺利。
【解决方案2】:

为版本 11.0 (11A420a) 更新 Xcode

对于有此问题的用户和 Storyboard,我建议在您的配色方案中将“任何外观”默认设置为 Light 模式。 例如,对于深色我有灰色背景和浅白色,字体是相反的,白色和深灰色。默认一切为轻模式,IOS 会将其解释为轻模式,您不会有任何问题。

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

【讨论】:

    【解决方案3】:

    Apple 似乎知道这一点。

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

    请注意,使用命名颜色使用 Xcode 11 构建的应用程序可能 应用程序运行时遇到查找失败(没有返回值) 在 iOS 11 或更早版本上。这将在未来的 Xcode 更新中修复。至 避免此问题,将最低部署目标提高到 iOS 12 或 稍后提交到 App Store,或者使用下一个 Xcode 重新构建 GM 候选种子可用时。

    更新 20190917

    使用 Xcode 11 GM seed 2 构建您的应用,其中包括适用于 iOS 的 SDK 13、iPadOS、watchOS 6、tvOS 12 和 macOS Catalina。从四月开始, 2020 年,所有提交到 App Store 的 iOS 应用都需要构建 使用 iOS 13 SDK 或更高版本。他们还必须支持全屏 iPhone XS Max 或 12.9 英寸 iPad Pro(第 3 代)的设计,或 稍后。

    【讨论】:

    • Xcode11 的 GM2 出局了.. 也许它可以解决这个问题 developer.apple.com/news/releases/?id=09162019a
    • 我可以确认它没有修复任何问题,我使用的是 11.0 (11A420a) 版本,其中一个是最新版本,但在 IOS 上它默认所有内容为白色,无法解决我的问题。
    【解决方案4】:

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

    另外,您可以使用

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

    【讨论】:

      【解决方案5】:

      似乎问题出在 Apple 方面。甚至 Xcode 11 GM 种子也有这个问题。人们正在苹果开发者论坛上讨论这个问题。

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

      【讨论】: