皮肤(主题)更换实现

引:之前一个项目用到过皮肤切换,自己封装了下,封装的不是很好用,现在这个项目又要用到,就想着看看别个大牛的封装想看点这里,借鉴了大牛的一些思路,写了个微型版的,还是很实用。(主要是大牛的源码有些不太看的懂,怕后期不好维护,逃。。。。)

正文:

1、实现思路:用一个SkinManger单例类管理皮肤的切换、添加和获取当前皮肤等操作。并发送一个全局的皮肤更换通知。用一个SkinBinderManger单例类和NSOject的类别实现对相应皮肤类的链接,并接收通知,更换皮肤。当前所有的皮肤类都是以一个抽象类BaseSkin为基类进行创建、和SkinManger与SkinBinderManger关联。

2、用法:

 //程序入口进行皮肤管理器初始化
 NSArray *skinNames = @[@"RedSkin",@"BlueSkin",@"BlankSkin"];
 for (NSString *skinName in skinNames) {
     [[SkinManger sharedInstence] addSkinWithName:skinName];
 }

//对需要改变皮肤的控件绑定皮肤
//label
[self.textLabel bindSkinCallBack:^(id sender, BaseSkin *skin) {
     UILabel *label = sender;
     label.textColor = skin.textColor;
}];
//imageView
[self.textImg bindSkinCallBack:^(id sender, BaseSkin *skin) {
      UIImageView *imgView = sender;
      imgView.image = [skin getImgNameWithIdentifier:@"tempImg"];
}];
//view
[self.textView bindSkinCallBack:^(id sender, BaseSkin *skin) {
     UIView *view = sender;
     view.backgroundColor = skin.bgColor;
 }];

//设置当前皮肤
[[SkinManger sharedInstence] setCurrentSkinWithName:@"BlankSkin"];

//改变当前皮肤
[[SkinManger sharedInstence] setCurrentSkinWithName:@"BlankSkin"];

3、注意
(1)、使用getImgNameWithIdentifier:方法时,需要将各种皮肤图片名称进行处理,以图片名称_类名称的形式存放在Xcode 工程文件的Assets.xcassets文件里面(将图片名称进行修改),使用时直接使用修改前的图片名称。
(2)、第一次设置当前模型时,即调用setCurrentSkinWithName方法时,要保证所有的要改变皮肤的控件皮肤绑定成功。

4、最后:
demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,460评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 周末闲适之时,独自在家看了《七月与安生》,对于一个单身的姑娘来说,选一部感兴趣的电影,独自欣赏,不被打扰,边看边思...
    旻菓阅读 221评论 0 0
  • 梦中,不小心回忆起了那一劫。 岩洞里石壁上的图案那么清晰,我可以辨识出大部分符号的含义,重置空间需要解除两部分装置...
    名贝贝阅读 324评论 4 3
  • 有一天,两个非常年轻的人,一个姑娘和一个小伙子。坐在一块伸进水里的湖畔的石板上,湖水汩汩地拍打着他们的双脚。他们静...
    AngeliSoul阅读 499评论 0 2