【问题标题】:Setting app to have light/dark mode without the use of the device setting在不使用设备设置的情况下将应用设置为具有亮/暗模式
【发布时间】:2021-07-19 20:41:11
【问题描述】:

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

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

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

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

但我相信这是由设备级别的暗/亮模式设置控制的。如果有办法我可以创建一个模板来控制颜色?我确信我可以创建一个函数来调整所有内容的颜色,但是必须为所有内容创建一个插座有时会让人感到困惑。

对此有什么建议吗?

【问题讨论】:

标签: ios swift


【解决方案1】:

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

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

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

以下不是一个完整的解决方案,但代码 sn-ps 可以帮助您开始使用您的解决方案:

  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")
         }
    

【讨论】:

  • 使用选项 1,如果我在应用程序的设置中有一个开关控件,并且如果用户选择了暗模式,例如,我将重新加载设置页面,然后我可以执行相同的概念if statemtnt 并像您在这里一样更改 overrideUserInterfaceStyle programiccaly。只要我使用资产目录中的正确颜色设置标签颜色等,对吗?
  • 正确。每个页面/视图都可以被覆盖。
【解决方案2】:

我在 iOS-13 之前构建了一个带有明暗模式的应用,这是我们使用的

  • 添加大量插座并手动设置代码中的所有颜色。需要大量的工作,容易错过一些东西
  • 使用UIAppearance 代理更改默认 UI 元素的颜色。通常会产生意想不到的副作用,需要进行大量手动测试才能消除极端情况

这些选项都不是很好。但是,如果您的最低 iOS 版本为 13 或更高版本,则更好的选择是使用自适应和语义颜色添加原生暗模式支持。然后您应该能够在您的应用中添加一个 UI 控件,该控件在每个视图或每个视图控制器的基础上设置 overrideUserInterfaceStyle

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多