再说 iOS 和 macOS 深色模式

在 iOS 13 及之后的版本中,人们可以选择使用一种全局深色的外观,它就是深色模式(Dark Mode)。在深色模式中,系统对于所有的界面、菜单、控件都使用了深色色盘,也使用了更多的虚化效果(vibrancy)以使得与更暗的背景内容相比,前景内容能够更加显眼明亮。深色模式支持所有的辅助功能。

人们可以选择使用深色模式作为系统的默认界面样式,他们可以通过设置使设备在周围的灯光变暗时自动转换到深色模式。

  • 将焦点放在内容上:深色模式会把焦点放在你界面的内容区域,以让内容能够显眼,而周围的 UI 能够沉浸到背景中去。
  • 在浅色模式和深色模式下都测试你的设计:观察你的 app 的界面在两种模式下是什么样子,根据需要调整设计。在一个模式下表现良好的设计在另一个模式下可能就会有问题。
  • 当你调整对比度和透明度等辅助功能设置使,确保你 app 的内容可以在深色模式下保持舒服的可读性:在深色模式下,你应该测试在开启增强对比度和降低透明度功能时 app 的内容,包括单独开启时的测试和都开启时的测试。你可能会发现在一些深色背景上,深色的文本可读性会比较低。你也可能发现在深色模式下打开增强对比度会导致深色文本和深色背景之间的对比度。虽然具备正常视力的人们仍然能够阅读低对比度的文本,但这样的文本可能对于视力有损伤的人们就是不可读的。

目录

    • 系统定义的材料和虚化效果
  • 在 iOS 上实现 Dark Mode
  • 在 macOS 上实现 Dark Mode

颜色

在深色模式的色盘中包括了更深的背景颜色和更浅的前景颜色,他们都经过了仔细的筛选,在保持两个模式下的一致性的前提下,也确保了良好的对比度。

  • 使用适配当前外观的颜色:语义化颜色,像是「背景颜色」,可以自动适配当前的外观。当你需要一个自定义颜色时,添加一个颜色集合(Color Set)资源到你 app 的资源目录中,指定浅色和深色模式下的颜色变种,这样就可以适配当前的外观模式。避免使用硬编码的颜色值或者不能适配的颜色。
  • 在所有的外观下确保充足的颜色对比度:使用系统定义的颜色确保前景和背景内容间有合适的对比度比值。对于自定义颜色,以达到 7:1 的对比度比值为目标,特别是对于小的文本。
  • 软化白色背景的颜色:如果你必须在深色模式中对于内容使用白色背景,选择一个稍微深一点的白色,以避免背景会打亮周围的深色内容。

系统颜色

iOS 根据深色模式或者浅色模式定义了以下系统颜色,这些颜色值可能随着不断的版本迭代发生变化,所以使用系统 API 去调用这些系统颜色。

为增强可读性,系统颜色还有下面这些变种:

iOS 13 还引入了六种不透明的灰色值,虽然会用到的地方很少,但可以方便你在半透明效果不好的地方使用。比如在元素相交或者重叠时,像是网格中的线或者 bar,这些地方使用不透明的颜色更好。通常情况下还是应该使用系统颜色。

同样地,为增强可读性,有下列变种:

动态系统颜色

除了描边颜色,iOS 也根据语义对背景区域和前景内容提供了定义好的系统颜色,比如文本标签、分隔线、填充。这些颜色可以自动适配深色模式和浅色模式。

iOS 定义了两个系列的背景颜色:一个系列是「系统背景颜色」,另一个系列是「成组背景颜色」。每一个系列都包含了四个等级的变种以帮助传达信息的层级。通常情况下,在成组的 table view 上使用「成组背景颜色」,否则就使用「系统背景颜色」。

使用这两个系列的背景颜色,你可以通过下面这些方式使用不同的等级变种表现层级:

  • 在总体视图使用一级;
  • 在位于总体视图上的成组的内容和元素上使用二级;
  • 在位于二级元素上的成组的内容和元素上使用三级。

对于前景内容,iOS 系统定义了下面这些颜色:

  • 不要重新定义动态系统颜色的语义化定义:为了给人们创造一致化的体验,确保你的 app 的界面在不同的情景下都表现得没问题,应该倾向于使用动态系统颜色。
  • 不要尝试复制动态系统颜色:动态系统颜色可能基于不同的环境变量,随着版本的迭代发生波动。使用动态系统颜色去搭配系统颜色,而是创造自定义颜色去搭配系统颜色。

图片、图标、标志颜色

iOS 13 的系统使用了 SF Symbols,它可以在深色模式下保持美观。系统也使用了经过对浅色模式和深色模式都优化了的全颜色图片。

  • 在任何可能的地方使用 SF Symbols:使用了 SF Symbols 后,当你使用了动态颜色去给标志着色或者是增加了一层虚化效果时,标志都可以在两种模式下保持美观。
  • 必要时,为浅色和深色模式分别设计独立的图形元素:在浅色模式中,图形使用中空的描边,而在深色模式中,图形使用实心填充的形状样式可能会更好。
  • 确保全颜色的图片和图标显示没问题:如果在两种模式下看起来都不错,那就可以使用相同的资源。如果一个资源只在某个模式中显示没问题,那就修改资源或者为两种模式创建分别的资源。使用资源目录把两个资源组合成一个,命名成一张图片。

文本颜色

虚化效果可以使得深色背景上的文本保持良好的对比度。

  • 对于文本使用系统提供的文本颜色:系统提供的一级、二级、三级、四级文本颜色可以自动适配浅色和深色模式。
  • 使用系统视图绘制文本输入框和文本视图:系统视图和控件可以使你 app 的文本在所有的背景下看起来都没问题,并且可以根据虚化效果的有无自动调整适配。当你可以使用系统提供的视图去展示文本时就不要自己单独绘制文本视图。

材料

iOS 提供了材料效果(materials,也可叫 blur effects)以通过一种半透明的效果在 app 中创造深度的感觉。材料效果可以让视图和控件既暗示了背景上的内容,又不分散前景内容的注意力。为了制造这种效果,材料允许背景颜色信息穿过前景的视图,同时也会模糊背景的情景以保持可读性。

当你使用系统定义的材料效果时,你的 app 的元素会在各个情景中看起来都很好,因为这些效果可以自动适配系统的浅色模式和深色模式。

  • 以系统使用的材料效果为指导:在任何可能的时候,比较具备相似功能的你的 app 的自定义视图和系统提供的视图,对其使用相同的材料效果。
  • 利用好系统提供的文本、填充、图形、分隔线颜色:系统提供的颜色可以让这些元素在半透明的背景上看起来不错。
  • 在任何可能的时候,使用 SF Symbols:当你使用动态系统颜色去给一个标志着色或者应用一个虚化效果时,标志可以在任何情景中都看起来不错。与之相对比,全颜色的图片可能不能与背景形成足够的对比度,在用在一个半透明背景的视图上时也可能不合时宜。

系统定义的材料和虚化效果

iOS 定义了你可以在指定的区域使用的多种材料,以控制前景内容和背景的视觉分隔。系统提供的材料包括浅色和深色两种变种,可以很好地匹配大多数背景。

为了让材料用在内容容器中,iOS 13 定义了四种不同透明度的材料:

  • SystemUltraThinMaterial
  • SystemThinMaterial
  • SystemMaterial (默认)
  • SystemThickMaterial

注意以下几点:

  • 在选择材料时考虑对比度和视觉分隔:在选择使用哪种材料与虚化效果组合时,没有绝对的规则。在做出选择时考虑下面这些方面:
    • 更厚的材料可以在文本和其他元素间提供更好的对比度;
    • 通过在背景中提供一个内容的可见提醒,不透明度可以帮助人们记住当前的场景。

iOS 13 也为文本、填充、分隔定义了虚化值,可以与每一种材料匹配良好。通过从背景颜色中抽样、修改饱和度,虚化使 UI 元素更亮或更暗。虚化的 UI 元素可以与材料融合得更好,并增强半透明效果。

文本和填充都提供了几种等级的虚化效果,分隔线只有一个等级。等级的名字表明了元素和背景间的相对对比度,默认层级有着最高的对比度,第四等级有最低的对比度。

除了第四等级,你可以在任何材料上对文本使用下面的虚化效果值。不推荐在薄和超薄材料上使用第四等级,因为对比度太低。

  • label(默认)
  • secondaryLabel
  • tertiaryLabel
  • quaternaryLabel

你可以在任何材料上对填充使用下面的虚化效果值:

  • fill(默认)
  • secondaryFill
  • tertiaryFill

iOS 为分隔线定义了一个默认的虚化效果值,它可以与任何材料上都匹配地很好。

  • 基于语义化含义选择虚化效果:避免混用这些效果,例如,不要给分隔符使用文本的虚化效果。

在 iOS 上实现 Dark Mode

待补充…

在 macOS 上实现 Dark Mode

待补充…

参考链接

如果你觉得这篇文章对你有所帮助,欢迎请我喝杯咖啡,感谢你的支持:grin: