应用场景
- 背景图片
- 背景颜色
注意问题
-
问题一:
- 1.默认进来没有颜色
- 2.如果用户选中过颜色,需要将选中的颜色进行存储,下次进来就用之前选中的颜色
-
问题二:
- 多个控制器需要换肤时,代码非常的冗余
-
换肤使用注意:使用换肤要写在控制器的viewWillAppear方法中,避免换肤没有起作用
换肤工具类 封装
- 1.图片与plist文件结构
- 2.头文件.h
#import <UIKit/UIKit.h>
@interface SkinTool : NSObject
/**
* 通过该方法可以设置皮肤的颜色
*
* @param color 皮肤的颜色
*/
+ (void)setSkinColor:(NSString *)color;
/**
* 通过该方法,可以返回想要的UIImage
*
* @param name 图片的名称
*
* @return 当前皮肤对应的UIImage
*/
+ (UIImage *)skinToolWithImageName:(NSString *)name;
/**
* 返回当前皮肤的Label背景颜色
*
* @return 当前的背景颜色
*/
+ (UIColor *)skinToolLabelBgColor;
@end
- 3.实现文件.m
#import "SkinTool.h"
#define kSkinColor @"skin_color"
@implementation SkinTool
static NSString *_color;
+ (void)initialize
{
// 开始,从沙盒中取之前存储的皮肤颜色
_color = [[NSUserDefaults standardUserDefaults] objectForKey:kSkinColor];
if (_color == nil) { // 之前没有存储,取出为空
_color = @"blue";
}
}
/**
* 通过该方法可以设置皮肤的颜色
*
* @param color 皮肤的颜色
*/
+ (void)setSkinColor:(NSString *)color
{
_color = color;
// 将用户设置的皮肤颜色进行保存
[[NSUserDefaults standardUserDefaults] setObject:color forKey:kSkinColor];
[[NSUserDefaults standardUserDefaults] synchronize];
}
/**
* 通过该方法,可以返回想要的UIImage
*
* @param name 图片的名称
*
* @return 当前皮肤对应的UIImage
*/
+ (UIImage *)skinToolWithImageName:(NSString *)name
{
NSString *imageName = [NSString stringWithFormat:@"skin/%@/%@", _color, name];
return [UIImage imageNamed:imageName];
}
/**
* 返回当前皮肤的Label背景颜色
*
* @return 当前的背景颜色
*/
+ (UIColor *)skinToolLabelBgColor
{
// 1.获取文件所在的位置
NSString *filePath = [NSString stringWithFormat:@"skin/%@/bgColor.plist", _color];
// 2.获取plist的路径
NSString *plistPath = [[NSBundle mainBundle] pathForResource:filePath ofType:nil];
// 3.读取plist当中的数据
NSDictionary *colorDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
// 4.将字典当中的值取出
NSString *bgStr = colorDict[@"label_color"];
// 5.将颜色的字符串截取
NSArray *bgArray = [bgStr componentsSeparatedByString:@","];
// 6.取出颜色的r,g,b数值
CGFloat red = [bgArray[0] floatValue];
CGFloat green = [bgArray[1] floatValue];
CGFloat blue = [bgArray[2] floatValue];
// 7.返回当前皮肤的颜色
return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1.0];
}
@end
换肤工具类 使用
-
控制器中设计好界面,然后点击对应的按钮切换图片与Label对应的皮肤颜色
效果图.png
-
多控制器实现换肤
- ViewController控制器实现换肤
#import "ViewController.h"
#import "SkinTool.h"
@interface ViewController ()
// 脸的imageView
@property (weak, nonatomic) IBOutlet UIImageView *faceImageView;
// 心的imageView
@property (weak, nonatomic) IBOutlet UIImageView *heartImageView;
// 方块的imageView
@property (weak, nonatomic) IBOutlet UIImageView *rectImageView;
// 测试的Label
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
/**
* 点击蓝色切换蓝色皮肤
*/
- (IBAction)blueClick;
/**
* 点击绿色切换绿色皮肤
*/
- (IBAction)greenClick;
/**
* 点击红色切换红色皮肤
*/
- (IBAction)redClick;
/**
* 点击橘色切换橘色皮肤
*/
- (IBAction)orangeClick;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self changeImage]; // 第一次,显示默认皮肤颜色,因为之前沙盒中没有存储任何皮肤颜
}
#pragma mark - 切换皮肤
- (IBAction)blueClick {
[SkinTool setSkinColor:@"blue"]; // 设置皮肤颜色
[self changeImage]; // 根据皮肤颜色切换对应的图片
}
- (IBAction)greenClick {
[SkinTool setSkinColor:@"green"];
[self changeImage];
}
- (IBAction)redClick {
[SkinTool setSkinColor:@"red"];
[self changeImage];
}
- (IBAction)orangeClick {
[SkinTool setSkinColor:@"orange"];
[self changeImage];
}
#pragma mark - 切换背景图片的方法
/**
* 切换背景图片
*
* @param color 背景图片的颜色
*/
- (void)changeImage
{
// 1.设置脸部的图片
self.faceImageView.image = [SkinTool skinToolWithImageName:@"face"];
// 2.设置心脏的图片
self.heartImageView.image = [SkinTool skinToolWithImageName:@"heart"];
// 3.设置方片的图片
self.rectImageView.image = [SkinTool skinToolWithImageName:@"rect"];
// 4.设置测试Label的背景颜色
self.testLabel.backgroundColor = [SkinTool skinToolLabelBgColor];
}
@end
- SecondViewController控制器利用在ViewController设置皮肤,来显示对应的换肤图片
#import "SecondViewController.h"
#import "SkinTool.h"
@interface SecondViewController ()
// 脸的imageView
@property (weak, nonatomic) IBOutlet UIImageView *faceImageView;
// 心的imageView
@property (weak, nonatomic) IBOutlet UIImageView *heartImageView;
// 方块的imageView
@property (weak, nonatomic) IBOutlet UIImageView *rectImageView;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
// 换肤使用注意:使用换肤要写在viewWillAppear,避免换肤没有起作用
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.faceImageView.image = [SkinTool skinToolWithImageName:@"face"];
self.heartImageView.image = [SkinTool skinToolWithImageName:@"heart"];
self.rectImageView.image = [SkinTool skinToolWithImageName:@"rect"];
}
@end
网友评论
一开始UI就要想到这个才能兼容。想想自己的app,想要加入换肤就头疼;
1,UI开始的时候没有做各种颜色的图片;
2,字颜色也没有订。
你的文章简单明了。多谢