Ios 在不使用设备设置的情况下,将应用程序设置为亮/暗模式

Ios 在不使用设备设置的情况下,将应用程序设置为亮/暗模式,ios,swift,Ios,Swift,我正在开发一个iOS应用程序,在应用程序的设置范围内,我将允许用户使用明暗模式。默认情况下,该应用程序将是浅模式,但如果用户将其更改为暗模式,它将更改标签/背景/按钮等 我计划通过在共享默认值中存储亮模式或暗模式来实现这一点,当页面加载时,我将检查这一点 如果是暗模式,我知道我可以在ViewDidLoad()中根据需要更改颜色,但这似乎太多工作了。我这里有我需要的一套颜色: 我知道如果我愿意,我可以将标签设置为这种特定的颜色 但我相信这是由设备级暗/光模式设置控制的。如果有办法我可以创建一个

我正在开发一个iOS应用程序,在应用程序的设置范围内,我将允许用户使用明暗模式。默认情况下,该应用程序将是浅模式,但如果用户将其更改为暗模式,它将更改标签/背景/按钮等

我计划通过在共享默认值中存储亮模式或暗模式来实现这一点,当页面加载时,我将检查这一点

如果是暗模式,我知道我可以在ViewDidLoad()中根据需要更改颜色,但这似乎太多工作了。我这里有我需要的一套颜色:

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

但我相信这是由设备级暗/光模式设置控制的。如果有办法我可以创建一个模板来控制颜色?我相信我可以创建一个功能来调整所有东西的颜色,但是必须为所有东西创建一个插座,这会让人感到困惑


有什么建议吗?

我在iOS-13之前构建了一个明暗模式的应用程序,下面是我们使用的

  • 添加成吨的插座并手动设置代码中的所有颜色。需要大量的工作,容易错过一些东西
  • 使用代理更改默认UI元素的颜色。通常会产生意料之外的副作用,需要大量的手动测试来解决这些问题

这两种选择都不是很好。但是,如果最低iOS版本为13或更高,更好的选择是使用自适应颜色和语义颜色添加本机暗模式支持。然后,您应该能够在应用程序中添加一个UI控件,该控件可以按每个视图或每个视图控制器进行设置。

我认为您应该只更改存储在UserDefaults或其他地方的全局变量。并在assets.xdassets中设置所有颜色。在那里你把颜色设置为亮模式和暗模式。但正如我所知,没有办法系统地改变应用程序的外观(就像iOS所做的那样)。也许你可以试试RXSwift),它是反应式编程。继续。

暗模式有很多选项,管理这些选项的代码可能会非常复杂且容易出错,因此我们决定看看用户需要/想要什么,然后选择最自然(代码密集度较低)的方法来支持暗模式

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

  • 默认情况下,应用程序在设备切换时切换(除非用户在control center中覆盖,否则应用程序在本地时区变暗/变亮时切换)
  • 某些用户偏好始终以一种模式使用应用程序。我们添加了一个选项以覆盖默认设备设置,从而始终以该模式显示应用程序
  • 颜色的选择对用户来说可能是压倒性的。我们已经为用户提供了更改通知颜色(警报/横幅等)的选项,因此在选择明暗模式的颜色集时,我们选择使用系统颜色,这使得实现更加容易,并自动管理模式之间的切换
  • 以下不是完整的解决方案,而是帮助您开始使用解决方案的代码片段:

  • 用户设置覆盖模式

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

    }

  • 覆盖默认颜色(尝试限制到特定情况)


  • 这就是如何在明暗模式下管理颜色的方法


    这是否回答了您的问题?使用选项1,如果我在应用程序的设置中有一个开关控件,例如,如果用户选择了暗模式,我将重新加载设置页面,然后我可以对If statemnt执行相同的概念,并像您在这里一样更改overrideUserInterfaceStyle程序。只要我设置标签colors等,使用我在资产目录中的正确颜色,对吗?对。每个页面/视图都可以被覆盖。那太好了。谢谢。
     override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
     super.traitCollectionDidChange(previousTraitCollection)
     // Update user interface if changes to Dark Mode detected.
     MasterTable.reloadData()
    
     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")
         }