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 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)的主要内容,如果未能解决你的问题,请参考以下文章
在滚动视图中更改 UIView 而 / 更新滚动视图高度 - Swift 3 / Xcode 8
开关打开时更改 UITableViewCells 的背景颜色 - Swift