推广

iOS皮肤适配

iseeyu2年前 (2024-02-21)推广136

皮肤配置文件

如图所示,创建 light.json 和 dark.json ( light 和 dark 配置路径key 一样,对应的value 不同)

light.json 配置示例

{
    "statusBarStyle": "black",
    "colors":{
        "mainFunction":"#E92424",
        "gradientStockUp":[
            "#0FFFFFFF",
            "#0FE92424"
        ]
    },
    "images": {
        "selfStock_info_icon": "appres/skinImage/light/selfStock_info_icon.png",
        "selfStock_money_icon": "appres/skinImage/light/selfStock_money_icon.png",
      }
      
 // appres/skinImage/light/selfStock_info_icon.png 对应的图片文件夹路径
}

dark.json 配置示例

{
    "statusBarStyle": "red",
    "colors":{
        "mainFunction":"#BC935C",
        "gradientStockUp":[
            "#26171717",
            "#26E92424"
        ]
    },
    "images": {
        "selfStock_info_icon": "appres/skinImage/dark/selfStock_info_icon.png",
        "selfStock_money_icon": "appres/skinImage/dark/selfStock_money_icon.png",
      }
}

2、设置全局的colorKey 来对应颜色路径 imageKey 来对应图片路径,利于维护

颜色key配置

图片key配置

皮肤使用

1、获取皮肤资源协议方法

// 获取皮肤资源协议方法
- (HJThemeDataModel *)getThemeModelWithName:(NSString *)name {
    NSString *path = [NSString stringWithFormat:@"appres/theme/%@",name];
    NSDictionary *colorDic = [self getDictFromJsonName:path][@"colors"];
    NSDictionary *imageDic = [self getDictFromJsonName:path][@"images"];
    HJThemeDataModel *model = [HJThemeDataModel new];
    model.colorDic = colorDic;
    model.imageDic = imageDic;
    return model;
}

/// 设置默认主题(使用皮肤,至少有一个默认皮肤)
- (HJThemeDataModel *)getDefaultThemeModel {
    return [self getThemeModelWithName:@"light"];
}

2、皮肤使用

// 导入头文件
#import "HJThemeManager.h"

// 设置当前皮肤 或切换 皮肤为 @"light"
[[HJThemeManager sharedInstance] switchThemeWithName:@"light"];

// 设置当前view 的背景色
//1、适配皮肤
self.view.themeBackgroundColor = backgroundColorKey; 
//2、不适配皮肤,必须带#号
self.view.themeBackgroundColor = @“#333333”; 
//3、适配皮肤,随皮肤变化
self.view.themeBackgroundColor = [HJThemeManager getThemeColor:backgroundColorKey]; 
//4、指定皮肤,不会随皮肤变化
self.view.themeBackgroundColor = [HJThemeManager getThemeColor:backgroundColorKey themeName:@"light"]; 

/**
  * [HJThemeManager getThemeColor:backgroundColorKey];
  * 实质上是 theme://"backgroundColorKey"?
  * 
  * [HJThemeManager getThemeColor:backgroundColorKey themeName:@"light"]; 
  * 实质上是 theme://"backgroundColorKey"?themeName=light
  */
//所以可以直接写URL 例如:
self.view.themeBackgroundColor = theme://backgroundColorKey?themeName=light;

// 设置当前imageView 的image
//1、适配皮肤
imageView.themeImage = imageKey; 
//2、适配皮肤,随皮肤变化
imageView.themeImage = [HJThemeManager getThemeImage:imageKey]; 
//3、指定皮肤,不会随皮肤变化
imageView.themeImage = [HJThemeManager getThemeImage:imageKey themeName:@"light"]; 

/**
  * [HJThemeManager getThemeImage:imageKey];
  * 实质上是 theme://"imageKey"?
  * 
  * [HJThemeManager getThemeImage:imageKey themeName:@"light"]; 
  * 实质上是 theme://"imageKey"?themeName=light
  */

//完整写法,指定皮肤
imageView.themeImage = theme://"imageKey"?themeName=light; 

//  兼容不适配皮肤写法
//  imageNamed 加载图片
imageView.themeImage = bundle://"imageKey"; 
//  sdwebimage 解析 http/https 加载图片
imageView.themeImage = http://imagePath; 
//  使用serverManager  getimage 的协议方法获取图片
imageView.themeImage = imagePath; 

3、皮肤的实现原理
1、创建一个NSObject分类(category),然后关联一个字典属性(themes),用于进行缓存UI控件调用的颜色方法和参数或者是图片方法和参数。再关联属性的时候添加一个通知监听,用于切换皮肤时,发送通知,然后再次调用缓存的方法和参数,进行颜色和图片的更换。

2、创建UI控件的分类(category),然后每个分类都有themes字典,然后设置新的方法来设置颜色或图片。在该方法内,需要做的处理有:

颜色举例说明:themeBackgroundColor = colorKey

a、在 themeBackgroundColor 的set方法中,判断是否是皮肤设置,皮肤的设置都是带有 theme:// 的字符串。这个(theme://)字符串是约定的。
b、皮肤适配模式,即带有 theme:// 字符串,就会用 themes 字典保存 系统的方法setBackgroundColor: 方法和参数colorKeythemeName,当切换皮肤时,再次调用 setBackgroundColor: 方法和参数colorKeythemeName
c、@”#333333″, 直接是色值方法的 不需要 themes 字典保存,只需要直接调用系统方法 setBackgroundColor:[UIColor colorFromHexString:@”#333333″];

图片举例说明:imageView.themeImage = imageKey

a、在 themeImage 的set方法中,判断是否是皮肤设置,皮肤的设置都是带有 theme:// 的字符串。这个(theme://)字符串是约定的。
b、皮肤适配模式,即带有 theme:// 字符串,就会用 themes 字典保存 系统的方法setImage: 方法和参数imageKeythemeName,当切换皮肤时,再次调用 setImage: 方法和参数imageKeythemeName
c、bundle://, 直接是调用系统方法setImage:[UIImage imageNamed:@”imageNamed”] 进行赋值,不需要进行 themes 字典保存处理;
d、http:// 或 https:// , 采用SD框架加载图片,不需要进行 themes 字典保存处理;

3、主要的UI控件的分类

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface UIView (CMSThemeView)

/// 设置皮肤文件名称 默认为空值,取当前皮肤
/// 可以设置指定皮肤  例如:  @"Dark" / @"Light" ;
/// defaultThemeKey 为默认皮肤
/// 如何设置  Color 或 Image 有 themeName ,优先使用 themeName 
指定皮肤
@property (nonatomic, copy) NSString *themeStyle;
@property (nonatomic, copy) NSString *themeBackgroundColor;
@property (nonatomic, copy) NSString *themeTintColor;
/// 根据路径获取color 并缓存方法和参数 ()
- (void)setThemeColorWithIvarName:(NSString *)ivarName colorPath:(NSString *)path;
@end

@interface UILabel (ThemeLabel)
@property (nonatomic, copy) NSString *themeTextColor;
@property (nonatomic, copy) NSString *themeHighlightedTextColor;
@property (nonatomic, copy) NSString *themeShadowColor;
/// 主要是颜色
@property (nonatomic, strong) NSAttributedString *themeAttributedText;
@end

@interface UITextField (ThemeTextField)
@property (nonatomic, copy) NSString *themeTextColor;
@end

@interface UIImageView (CMSThemeImageView)
@property (nonatomic, copy) NSString *themeImage;

// 带有 UIImageRenderingMode 的处理,image 修改渲染色的,即tintColor
- (void)themeSetImageKey:(NSString *)imageKey
               renderingMode:(UIImageRenderingMode)mode;

@end

@interface UIButton (ThemeButton)

- (void)themeSetImage:(NSString *)path forState:(UIControlState)state;
- (void)themeSetImage:(NSString *)path forState:(UIControlState)state renderingMode:(UIImageRenderingMode)mode;
- (void)themeSetBackgroundImage:(NSString *)path forState:(UIControlState)state;
- (void)themeSetTitleColor:(NSString *)path forState:(UIControlState)state;
@end

@interface UITableView (ThemeTableView)
@property (nonatomic, copy) NSString *themeSeparatorColor;
@end

@interface CALayer (ThemeLayer)
/// 设置皮肤文件名称 默认为空值,取当前皮肤  eg:  @"Dark" / @"Light" ; defaultThemeKey 为默认皮肤
@property (nonatomic, copy) NSString *themeStyle;
@property (nonatomic, copy) NSString *themeBackgroundColor;
@property (nonatomic, copy) NSString *themeBorderColor;
@property (nonatomic, copy) NSString *themeShadowColor;
/// 根据路径获取cgcolor 并缓存方法和参数 ()
- (void)setThemeCGColorWithIvarName:(NSString *)ivarName colorPath:(NSString *)path;
@end

以上是简单列举了几个,其他UIKIt 控件一样分类处理即可

皮肤颜色流程图

皮肤颜色流程图

皮肤图片流程图

皮肤图片流程图

存在的缺陷

1、不能全局统一处理,需要一处一处的设置,比较麻烦。
2、目前还不支持网络下载皮肤功能,需要其他位置处理下载解压过程。
3、XIB的使用还需要其他的处理,这个比较重要

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56698.html

相关文章

如何利用自媒体做SEO优化。

如何利用自媒体做SEO优化。

传统的搜索引擎优化者或许会把大部分精力会集在独立的网站上,试图将独立网站的首要关键词优化到百度的第一页,然后即使suc成功了。可是他们疏忽了一个关键点:转化率。任何企业网站(或商店)都必须以流量的转化率作为最终规范。提高转化率的最好方法是将搜索引擎优化与媒体相结合。 搜索引擎在一个...

营销型网站SEO优化。

营销型网站SEO优化。

营销型网站实现其营销转化价值,前提必须得去做推广,推广包含付费和免费,其中网站SEO优化就属于免费了,做好了能够帮助企业提升品牌、节省成本、获取客户。很多企业想多网站SEO优化不知道如何下手,主要是不懂优化技术,下面重蔚自留地就给大家详细介绍下:营销型网站SEO优化怎么做? 1、确定优化方向和核心...

巨量引擎广告账户如何搭建?巨量引擎账户搭建要点

巨量引擎广告账户如何搭建?巨量引擎账户搭建要点

作为国内信息流广告的先行者,巨量引擎保持着绝对市场领导者地位,也是信息流优化师必须要掌握的渠道,所以今天就从“巨量引擎的账户搭建”开始讲解。 一个精细化的巨量引擎账户结构决定了我们账户成本的高与低,它包含广告组、广告计划、创意三个基本元素。 前期账户搭建对后期数据分析至关重要,不同...

品类罗盘专业版能看竞店吗,单品分析入口不见了显示品类罗盘(生意参谋品类罗盘功能介绍)

品类罗盘专业版能看竞店吗,单品分析入口不见了显示品类罗盘(生意参谋品类罗盘功能介绍)

可以的,订购了品类罗盘(标准版/专业版)目前可支持配置1个竞店、3个竞品的。其实品类罗盘是属于生意参谋的一个功能分类的,是由原来的“商品功能”升级而来的。...

SEO基础软文的概述。

SEO基础软文的概述。

1、可以降低企业的广告成本 一般的网络广告成本往往是很高的,硬性广告一般来说获得较好的流量,但是针对的用户群体不够精准,而且费用很高。一篇或者一系列软文的价格远远低于竞价或硬性广告的费用,而且一篇好的软文会被别人免费帮助转载,扩大软文的传播范围;一篇好的软文会制造许多话题来引导别人讨论、引起别人的...

新手博主如何找对标账号,找到爆款选题?

新手博主如何找对标账号,找到爆款选题?

在做小红书的时候,你有没有这种困惑?同样是一个选题,有的账号出爆文,有的就扑街。 作为新账号,该如何找选题,找对标进行模仿? 刚开始做小红书的商家、博主,建议从对标拆解、爆款选题、爆款拆解、超越突破来进行更新。 一、对标标准:4大标准3个方法 二、找爆款选题:关键词和热门笔...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片