Swift 3 - 通过开关更改所有视图控制器的背景颜色(深色 mode/Night 模式)

Swift 3 - Changing background colour of all view controllers, via switch(Dark mode/Night mode)

我创建了一个开关,让用户可以更改背景颜色(深色模式)。这仅适用于代码链接的视图控制器。我将如何设置它以便当开关被激活为暗模式或亮模式时,我的应用程序中的每个视图控制器都会发生变化,而不仅仅是一个。这是我的代码:

import UIKit

class 黑暗模式:UIViewController {

@IBOutlet var DarkSwitch: UISwitch!


@IBOutlet var LightSwitch: UISwitch!

var DarkisOn = Bool()
var LightisOn = Bool()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    let DarkDefault = UserDefaults.standard

    DarkisOn = DarkDefault.bool(forKey: "DarkDefault")




    let LightDefault = UserDefaults.standard

    LightisOn = LightDefault.bool(forKey: "LightDefault")



    if (DarkisOn == true) {

        DarkSwitch.isOn = true
        LightSwitch.isOn = false
        //run dark theme
        DarkTheme()


    }


    if (LightisOn == true) {

        DarkSwitch.isOn = false
        LightSwitch.isOn = true
        //run light theme
        LightTheme()




    }       



}


  func DarkTheme()    //dark colour
{
    self.view.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)





}

 func LightTheme()   //light colour
{
    self.view.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

}




@IBAction func DarkAction(_ sender: Any)
{
    DarkSwitch.isOn = true
    LightSwitch.isOn = false

    //run dark theme func
    DarkTheme()

    let DarkDefault = UserDefaults.standard
    DarkDefault.set(true, forKey: "DarkDefault")

    let LightDefault = UserDefaults.standard
    LightDefault.set(false, forKey: "LightDefault")


}



@IBAction func LightAction(_ sender: Any)
{
    DarkSwitch.isOn = false
    LightSwitch.isOn = true

    //run light theme func
    LightTheme()

    let DarkDefault = UserDefaults.standard
    DarkDefault.set(false, forKey: "DarkDefault")

    let LightDefault = UserDefaults.standard
    LightDefault.set(true, forKey: "LightDefault")


}

}

对于我的一个项目,我创建了一个 class 来控制我所有 ViewController 的 UI 配色方案。

class UIColourScheme {
    func set(for viewController: UIViewController) {
        viewController.view.backgroundColor = bgColour
        ...
    }
    var bgColour = UIColor.black 
    static let instance = UIColourScheme()
}  

然后我会在 viewDidLoad() 中为每个 ViewController

调用这个函数
class MyViewController : UIViewController {
    func viewDidLoad() {
        ...
        UIColourScheme.instance.set(for:self)
    }
} 

我的配色方案class 为所有内容设置颜色,但它可以简化为如上所示的背景颜色。

你可以像这样创建一个基础class(这是我用过的。)

class BaseViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.isTranslucent = false

    self.navigationController?.navigationBar.barTintColor = MainColor
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]//user global variable

    self.navigationController?.navigationBar.barStyle = UIBarStyle.black //user global variable
    self.navigationController?.navigationBar.tintColor = UIColor.white //user global variable
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

在这里设置你所有的主题。 所有颜色值都应该是全局的,您可以从另一个 ViewController.

更改

现在像这样声明所有 ViewController

class HomeViewController: BaseViewController {

}

这样,主页ViewController 将具有您在基地ViewController 中设置的所有外观。

现在您所要做的就是更改这些全局变量的颜色值。

你可以使用这个

protocol colorable {
   func setcolor(color: UIColor)
}
class HomeVC: colorable {

}

我修改了viewWillAppear方法。并添加了基于一天中时间的黑暗模式。
您不需要格式化收到的 time/hours 您可能想在条件语句中按原样使用它。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    // get time of the day
    let hour = Calendar.current.component(.hour, from: Date())
    print(hour)

    if hour >= 14 {
        overrideUserInterfaceStyle = .dark
    }
    else {
        overrideUserInterfaceStyle = .light
    }

}