- 优点:快
- 缺点;不知道
<h3>先上效果图</h3>
<img src="https://img.haomeiwen.com/i1215250/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单例添加需要进行主题切换的控件
- parameter needview: 需要添加的控价组 [UIView]类型的数组
- parameter ifImageName: 如果有imageView 就在写上白天的图片名称
*/
ThemeManger.sharedSingleton.addNeedThemeViews([view, themeView], ifImageName: "image.jpg")
/*
//添加两组Imageview 需要这么写,后面的参数只对一个imageView有效
//在bounder中要添加两套图片资源,一套正常的image.jpg,一套对应的夜间模式的image_night.jpg,(png的也可以)
ThemeManger.sharedSingleton.addNeedThemeViews([view1,imageView1], ifImageName: "image1")
ThemeManger.sharedSingleton.addNeedThemeViews([view2, imageView2], ifImageName: "image2.jpg")
*/
}
<h3>具体实现的思路</h3>
1. 创建一个单例,ThemeManger,这个单例在初始化的时候就注册通知中
2. 添加一个私有属性,用来添加需要主题切换的UIView及它的子类,如下所示
```swift```
class ThemeManger : NSObject{
private var allThemeViews: [UIView]? =Array()
}
通过addNeedThemeViews这个方法来将主题View添加进私有属性中,在添加进数组之前还要进行一些其它的操作
swift
func addNeedThemeViews(needview: [UIView], ifImageName: String?) {
// 遍历数组
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添加私有数组中,前面的还要做一些操作
// 所以数组必须设为私有的
allThemeViews?.append(needView)
// 根据本地UserDefaults的状态,改变view的主题
needView.changeToThemeFromUserDefaults()
}
}
接受到通知的时候,单例会执行下面的函数
```swift```
// 收到改变的主题的通知就会调用这个方法
func change() {
// 改变本地的NSUserDefaults主题状态
if let bool: Bool = NSUserDefaults.standardUserDefaults().boolForKey("themeModel") {
NSUserDefaults.standardUserDefaults().setBool(!bool, forKey: "themeModel")
NSUserDefaults.standardUserDefaults().synchronize()
}
// 遍历数组,然后每个view都调用changeToThemeFromUserDefaults
if allThemeViews?.count > 0 {
for view in allThemeViews! {
view.changeToThemeFromUserDefaults()
}
}
}
接下来就是给View extension一些属性和方法了
swift
extension UIView {
/// 保存默认的背景颜色
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)
}
}
/**
变成默认主题
*/
func changeToNormalTheme() {
if normalBackgroundColor != nil {
self.backgroundColor = normalBackgroundColor
} else {
self.backgroundColor = NormalThemeColors.backgroundColor
}
}
/**
变成夜间主题,
*/
func changeToNightTheme() {
if self.nightBackgroundColor != nil {
self.backgroundColor = self.nightBackgroundColor
} else {
//如果设置了夜间背景颜色就会自定义的,否则就会用默认的
self.backgroundColor = NightThemeColors.backgroundColor
}
}
/**
从本地的UserDefaults获取本地主题状态,并改变主题
*/
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
新司机第一次开车,请老司机们多多指教和点赞(^་།^)
网友评论