美文网首页iOS Developerswift 文章收集iOS-swift
swift 用extension一行代码切换主题

swift 用extension一行代码切换主题

作者: Swifter丶 | 来源:发表于2016-06-21 21:16 被阅读454次
  • 优点:快
  • 缺点;不知道

<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
新司机第一次开车,请老司机们多多指教和点赞(^་།^)

相关文章

网友评论

    本文标题:swift 用extension一行代码切换主题

    本文链接:https://www.haomeiwen.com/subject/egugdttx.html