【问题标题】:Swift 3 - Changing background colour of all view controllers, via switch(Dark mode/Night mode)Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)
【发布时间】: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 - 我刚开始你,你这个精英怪人。如果我不问问题,我怎么能学到……“看在上帝的份上”,如果你对我的问题无话可说,那就去做吧。

标签: ios iphone mobile swift3 viewcontroller


【解决方案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
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2020-04-28
          • 1970-01-01
          • 2023-03-08
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多