iOS 换肤

作者: iOS_成才录 | 来源:发表于2015-11-12 19:36 被阅读4005次

    应用场景

    • 背景图片
    • 背景颜色

    注意问题

    • 问题一:

      • 1.默认进来没有颜色
      • 2.如果用户选中过颜色,需要将选中的颜色进行存储,下次进来就用之前选中的颜色
    • 问题二:

      • 多个控制器需要换肤时,代码非常的冗余
    • 换肤使用注意:使用换肤要写在控制器的viewWillAppear方法中,避免换肤没有起作用

    换肤工具类 封装

    • 1.图片与plist文件结构
    文件结构.png
    • 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
    

    相关文章

      网友评论

      • eaacc8644537:too low
      • 多情刀客无情刀:图片和字典都加载不出来为啥?
      • 53a8d81e6bd7:这个换肤,需要一开始框架就要设计好,如果后面追加换肤。要修改的内容就多了;
        一开始UI就要想到这个才能兼容。想想自己的app,想要加入换肤就头疼;
        1,UI开始的时候没有做各种颜色的图片;
        2,字颜色也没有订。

        你的文章简单明了。多谢
      • 54da79050370:你从小码哥大神班出来的吧
      • 47a6dc23ee9a:你好问一下奥,文件路径用本地的为什么plist文件里面去出来的值为空呢
      • ekg:明天测试一下

      本文标题:iOS 换肤

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