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