iOS 13.0-支持深色模式并支持iOS 11和12的最佳方法

问题描述 投票:11回答:1

所以我已经发布在Apple Developer Forums上,但尚未得到答复。

背景:

iOS 13引入了暗模式和许多具有预定义的亮和暗变体的系统颜色:(https://developer.apple.com/videos/play/wwdc2019/214/

这些颜色可以直接在情节提要中用作已命名的颜色。它们也已作为静态颜色添加到UIColor类中:(https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors

但是,添加到UIColor的静态颜色在iOS 11和12中的代码中不可用。这很难使用,因为对新系统颜色的所有引用都必须包装在可用性检查中:Availability checks for UIColors

[这也引发了一个问题:在iOS 11和12上,直接在Storyboard中使用时,系统颜色会解析为什么?在我们的测试中,它们似乎可以解析为Light变体,尽管我们尚未测试所有变量。


当前方法:

这是我们所追求的方法。我们将所有颜色添加到我们的Colors.xcassets文件中以支持较旧的iOS版本,并通过我们的CustomColors Enum执行单个版本检查和映射,以便根据iOS版本返回正确的UIColor系统颜色。放弃对iOS 11和12的支持后,我们将从Colors.xcassets中删除相应的颜色,因为我们将仅使用系统颜色。我们还将重构所有情节提要以使用新的系统颜色。

Custom color enum

此方法的缺点是:

  • 如果放弃对iOS 11和12(UIColor.label,UIColor.systemBackground等)的支持后,如果要在代码中直接使用系统颜色,则摆脱所有枚举引用可能是一个很大的重构] >
  • 因为我们将在情节提要中使用系统颜色,所以必须确保我们的Colors.xcassets等效项使用相同的颜色代码
  • 此错误:(UIColor(named:) always returns nil on iOS 11.0-11.2)-如果未修复,则此方法不可用(编辑
  • :此错误已在XCode 11 GM种子2 11A420a中修复)
  • 与所有资产目录一样,使用魔术字符串访问目录中的项目可以使开发人员容易犯错误并获得零而不是资产(在这种情况下为颜色)。如果我们不对每个屏幕进行测试,则可能导致难以拾取的错误,从而迫使我们编写crashIfAllColorsNotDefined()方法。使用枚举确实减轻了这种风险,因为魔术弦仅存储/使用在一个地方。
  • [其他方法:(How do I easily support light and dark mode with a custom color used in my app?


问题:

[通过使用新的系统颜色,同时仍支持iOS 11和12,可以使用其他哪些方法来支持iOS 13的暗模式?在较旧的iOS版本上的情节提要中使用新的系统颜色是否安全?

所以我已经发布在Apple Developer Forums上,但尚未得到答复。背景:iOS 13引入了暗模式和多种系统颜色,并具有预定义的亮和暗变体:(https:// ...

ios swift uistoryboard uicolor ios13
1个回答
0
投票

将Enum和UIColor Extension结合使用是最后的方法。

© www.soinside.com 2019 - 2024. All rights reserved.