首页 > 解决方案 > 在不使用设备设置的情况下将应用设置为具有亮/暗模式

问题描述

我正在开发一个 iOS 应用程序,在应用程序的设置中,我将允许用户使用浅色或深色模式。该应用程序默认为浅色模式,但如果用户将其更改为深色模式,它将更改标签/背景/按钮等。

我计划通过在共享默认值中存储浅色或深色模式来做到这一点,当页面加载时,我会检查它。

如果是深色模式,我知道我可以在 ViewDidLoad() 中按需更改颜色,但这似乎工作量太大。我在这里有我需要的一组颜色:

在此处输入图像描述

我知道如果我愿意,我可以将标签设置为这种特定的颜色......

在此处输入图像描述

但我确实相信这是由设备级别的暗/亮模式设置控制的。如果有办法我可以创建一个模板来控制颜色?我确信我可以创建一个函数来调整所有内容的颜色,但是必须为所有内容创建一个出口可能会随着时间的推移而令人困惑。

对此有什么建议吗?

标签: iosswift

解决方案


暗模式有很多选项,管理它的代码可能是压倒性的并且容易出错,因此我们决定看看我们的用户需要/想要什么,然后我们选择了最自然(并且代码密集度较低)的方法来支持暗模式。

我们决定希望我们的应用程序遵循以下原则:

  1. 默认是设备切换时应用切换(除非用户在控制中心覆盖,应用在本地时区变暗/变亮时切换。
  2. 一些用户倾向于始终以一种模式使用该应用程序。我们添加了一个选项来覆盖默认设备设置以始终以该模式显示应用程序。
  3. 颜色的选择对用户来说可能是压倒性的。我们已经为用户提供了更改通知颜色的选项(警报/横幅等),因此在为浅色/深色模式选择颜色集时,我们选择使用系统颜色,这使得实现更加容易并管理模式之间的切换自动地。

以下不是完整的解决方案,而是帮助您开始使用解决方案的代码片段:

  1. 用户设置覆盖模式

     override func viewDidLoad() {
         super.viewDidLoad()
         // get the user option and set the relevant mode
         if Options.userDarkModeOption == .dark {
             overrideUserInterfaceStyle = .dark
         } else {
             overrideUserInterfaceStyle = .light
         }
     }
    
  2. 检测模式变化(用户在控制中心或本地时间变化)

     override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
     super.traitCollectionDidChange(previousTraitCollection)
     // Update user interface if changes to Dark Mode detected.
     MasterTable.reloadData()
    

    }

  3. 覆盖默认颜色(尽量限制在特定情况下)

     switch traitCollection.userInterfaceStyle {
         case .dark :
             cell?.contentView.backgroundColor =  = UIColor(red: 0.95, green: 0.95, blue: 0.95, alpha: 1)
         case .light :
             cell?.contentView.backgroundColor =  UIColor.systemTeal
         case .unspecified :
             cell?.contentView.backgroundColor =  UIColor.systemOrange
         @unknown default:
             print("Error: Unknown userInterFaceStyle in masterVC/cellforitem")
         }
    

推荐阅读