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

Posted

技术标签:

【中文标题】Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)【英文标题】:Swift 3 - Changing background colour of all view controllers, via switch(Dark mode/Night mode) 【发布时间】:2017-05-29 21:56:18 【问题描述】:

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

import UIKit

类 DarkMode: 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")



【问题讨论】:

可能最简单的方法是将它们全部从一个覆盖 viewDidLoad 的子类中继承,代码如下。 这个tutorial 可能会对你有所帮助。 看在上帝的份上,请阅读风格指南。我什至不知道从哪里开始。 Oscar Apeland - 我刚开始你,你这个精英怪人。如果我不问问题,我怎么能学到……“看在上帝的份上”,如果你对我的问题无话可说,那就去做吧。 【参考方案1】:

你可以像这样创建一个基类(这是我用过的东西。)

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 更改。

现在像这样声明你所有的 ViewControllers

class HomeViewController: BaseViewController 


这样 HomeViewController 将拥有您在 BaseViewController 中设置的所有外观。

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

【讨论】:

【参考方案2】:

对于我的一个项目,我创建了一个类来控制所有 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)
    
 

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

【讨论】:

【参考方案3】:

你可以用这个

protocol colorable 
   func setcolor(color: UIColor)

class HomeVC: colorable 


【讨论】:

【参考方案4】:

我修改了viewWillAppear 方法。并根据一天中的时间添加暗模式。 您不需要格式化您收到的时间/小时,您可能想在条件语句中使用它。

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
    


【讨论】:

以上是关于Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)的主要内容,如果未能解决你的问题,请参考以下文章

更改所有类的所有视图控制器的背景颜色(swift 4)

在滚动视图中更改 UIView 而 / 更新滚动视图高度 - Swift 3 / Xcode 8

开关打开时更改 UITableViewCells 的背景颜色 - Swift

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?

如何使用 swift 在一个视图控制器中更改状态栏颜色?

使用开关在整个应用程序中更改文本,单元格和视图控制器的颜色