swift 用extension一行代码切换主题

  • 优点:快
  • 缺点;不知道

<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单例添加需要进行主题切换的控件

     - 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
新司机第一次开车,请老司机们多多指教和点赞(^་།^)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容