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