iOS点点滴滴iOS Developer

皮肤(主题)更换实现

2017-08-01  本文已影响0人  稻_草_人

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

正文:

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

上一篇下一篇

猜你喜欢

热点阅读