- 優(yōu)點:快
- 缺點啤誊;不知道
<h3>先上效果圖</h3>
<img src="http://upload-images.jianshu.io/upload_images/1215250-3d2db8ef31d85168.gif?imageMogr2/auto-orient/strip" width="100px" height="100px" alt="theme.gif">
<h3>一行代碼</h3>
swift
@IBOutlet weak var themeView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
/**
ThemeManager單例添加需要進(jìn)行主題切換的控件
- parameter needview: 需要添加的控價組 [UIView]類型的數(shù)組
- parameter ifImageName: 如果有imageView 就在寫上白天的圖片名稱
*/
ThemeManger.sharedSingleton.addNeedThemeViews([view, themeView], ifImageName: "image.jpg")
/*
//添加兩組Imageview 需要這么寫,后面的參數(shù)只對一個imageView有效
//在bounder中要添加兩套圖片資源嘲叔,一套正常的image.jpg,一套對應(yīng)的夜間模式的image_night.jpg,(png的也可以)
ThemeManger.sharedSingleton.addNeedThemeViews([view1,imageView1], ifImageName: "image1")
ThemeManger.sharedSingleton.addNeedThemeViews([view2, imageView2], ifImageName: "image2.jpg")
*/
}
<h3>具體實現(xiàn)的思路</h3>
1. 創(chuàng)建一個單例停局,ThemeManger挤渐,這個單例在初始化的時候就注冊通知中
2. 添加一個私有屬性侈咕,用來添加需要主題切換的UIView及它的子類怜俐,如下所示
```swift```
class ThemeManger : NSObject{
private var allThemeViews: [UIView]? =Array()
}
通過addNeedThemeViews這個方法來將主題View添加進(jìn)私有屬性中制圈,在添加進(jìn)數(shù)組之前還要進(jìn)行一些其它的操作
swift
func addNeedThemeViews(needview: [UIView], ifImageName: String?) {
// 遍歷數(shù)組
for needView in needview {
needView.normalBackgroundColor = needView.backgroundColor
if let label = needView as? UILabel {
label.normalTextColor = label.textColor
}
if let imageView = needView as? UIImageView {
imageView.imagename = ifImageName
}
// 這才是真正的將view添加私有數(shù)組中,前面的還要做一些操作
// 所以數(shù)組必須設(shè)為私有的
allThemeViews?.append(needView)
// 根據(jù)本地UserDefaults的狀態(tài)侯养,改變view的主題
needView.changeToThemeFromUserDefaults()
}
}
接受到通知的時候敦跌,單例會執(zhí)行下面的函數(shù)
```swift```
// 收到改變的主題的通知就會調(diào)用這個方法
func change() {
// 改變本地的NSUserDefaults主題狀態(tài)
if let bool: Bool = NSUserDefaults.standardUserDefaults().boolForKey("themeModel") {
NSUserDefaults.standardUserDefaults().setBool(!bool, forKey: "themeModel")
NSUserDefaults.standardUserDefaults().synchronize()
}
// 遍歷數(shù)組,然后每個view都調(diào)用changeToThemeFromUserDefaults
if allThemeViews?.count > 0 {
for view in allThemeViews! {
view.changeToThemeFromUserDefaults()
}
}
}
接下來就是給View extension一些屬性和方法了
swift
extension UIView {
/// 保存默認(rèn)的背景顏色
var normalBackgroundColor: UIColor? {
get {
return objc_getAssociatedObject(self, &rt_normalColor) as? UIColor
}
set {
objc_setAssociatedObject(self, &rt_normalColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
/// 保存夜間的背景顏色
var nightBackgroundColor: UIColor? {
get {
return objc_getAssociatedObject(self, &rt_nightColor) as? UIColor
}
set {
objc_setAssociatedObject(self, &rt_nightColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
/**
變成默認(rèn)主題
*/
func changeToNormalTheme() {
if normalBackgroundColor != nil {
self.backgroundColor = normalBackgroundColor
} else {
self.backgroundColor = NormalThemeColors.backgroundColor
}
}
/**
變成夜間主題,
*/
func changeToNightTheme() {
if self.nightBackgroundColor != nil {
self.backgroundColor = self.nightBackgroundColor
} else {
//如果設(shè)置了夜間背景顏色就會自定義的沸毁,否則就會用默認(rèn)的
self.backgroundColor = NightThemeColors.backgroundColor
}
}
/**
從本地的UserDefaults獲取本地主題狀態(tài)峰髓,并改變主題
*/
func changeToThemeFromUserDefaults() {
let str = NSUserDefaults.standardUserDefaults().objectForKey("themeModel")
if str === false {
changeToNormalTheme()
}
if str === true {
changeToNightTheme()
}
}
}
還有UIImageView和UILabel差不多也一樣了
<h3>最后</h3>
github https://github.com/Yuanjihua1/themedemo/tree/master
新司機(jī)第一次開車,請老司機(jī)們多多指教和點贊(^??^)