• <i id='xa62v'><div id='xa62v'><ins id='xa62v'></ins></div></i>

    <ins id='xa62v'></ins>

  • <i id='xa62v'></i>
      <dl id='xa62v'></dl>

    1. <tr id='xa62v'><strong id='xa62v'></strong><small id='xa62v'></small><button id='xa62v'></button><li id='xa62v'><noscript id='xa62v'><big id='xa62v'></big><dt id='xa62v'></dt></noscript></li></tr><ol id='xa62v'><table id='xa62v'><blockquote id='xa62v'><tbody id='xa62v'></tbody></blockquote></table></ol><u id='xa62v'></u><kbd id='xa62v'><kbd id='xa62v'></kbd></kbd>
    2. <fieldset id='xa62v'></fieldset>

            <code id='xa62v'><strong id='xa62v'></strong></code>
            <span id='xa62v'></span>

            <acronym id='xa62v'><em id='xa62v'></em><td id='xa62v'><div id='xa62v'></div></td></acronym><address id='xa62v'><big id='xa62v'><big id='xa62v'></big><legend id='xa62v'></legend></big></address>
          1. iOS 主题/皮肤之 SakuraKit

            • 时间:
            • 浏览:10
            • 来源:124软件资讯网

              sakura-kit-logo

              前言

              现在市场上许多 App 都有主题变换、皮肤切换的功效 。随着项目代码量的不停增加  ,营业不停完善 ,功效性代码逐渐趋于模块化 ,尤其是在多人协作开发统一个项目时  ,模块解耦尤为主要  ,同时  ,公共基础库的功效性代码使用越简朴越好  。

              前段时间在维护旧项目时  ,收到 App 主题变换、皮肤切换的需求  ,其包罗 App 中种种图标、色值、文字、字体等都包罗在内  ,都需实现主题化  。主要用于:

              1. 运动主题展示:比力典型的是类似京东618、天猫淘宝购物节主题变换  。

              2. 用户夜间模式:类似阅读相关 App 的夜间模式  ,如:简书等  。

              3. 用户主题变换:用户可通过当地或者远程下载喜欢的主题  ,如:网易音乐、QQ 音乐等 App 主题变换  。

              由于老项目代码比力杂乱 ,功效模块耦合严重以及开发时间等综合因素 ,在实现 App 主题变换、皮肤切换的功效的同时 ,想要在只管不修改旧代码的基础上增添新的功效是比力贫苦的 。

              由于没有合适的第三方库  ,于是自己手撸了一个库 SakuraKit ,并开源  ,希望能帮到需要的朋侪  。

              下面我们最先先容 SakuraKit 及快速入门  。

              SakuraKit

              SakuraKit ,是一个轻量级的、专门用于 App 主题变换、皮肤切换的开源库(灵感源自 SwiftTheme、DKNightVersion等)  ,接纳函数式 + 链式的编码方式 ,简朴适用、利便明白、利于维护 。

              快速入门

              效果

              在体验前  ,我们先来看看效果图:

              sakura-kit-demo

              体验

              下面以 UIButton 为例  ,先容怎样使用 SakuraKit 举行主题化:

              UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
              button.sakura
              .backgroundColor(@"Home.buttonBackgroundColor")
              .titleColor(@"Home.buttonTitleColor", UIControlStateNormal);

              上述代码是给一个 button 的配景色(backgroundColor)以及题目颜色(titleColor)举行主题化 。其中 Home.buttonBackgroundColor 与 Home.buttonTitleColor 属设置文件中的 KeyPath  ,设置文件的功效有点类似语言当地化文件(Localizable.strings)  。后文会重点先容怎样设置设置文件  。

              到此为止  ,我们已经实现了 button 按钮主题化功效  ,若是你想切换主题  ,可以挪用如下 API:

              + (BOOL)shiftSakuraWithName:(TXSakuraName *)name type:(TXSakuraType)type;

              其中 name 参数代表主题的名称  ,type 参数代表主题类型(现在有两种:沙盒和当地) 。

              现在我们再详细的先容一下怎样使用 SakuraKit  。

              设置文件

              做过 App 语言当地化的童鞋  ,应该比力熟悉 Localizable.strings 文件设置  ,同理 ,我们在使用 SakuraKit 对 App 举行主题化时  ,也需要举行类似的设置  。现在支持 .json .plist 两种文件花样 。

              下面我们以 .json 文件花样做示例:

              {
                  "Home":{
                          "buttonBackgroundColor":"#BB503D",
                          "buttonTitleColor":"#4AF2A1"
                      }
              }

              在上述体验代码中 ,我们看到这样的字符串:Home.buttonBackgroundColor 和 Home.buttonTitleColor  ,这实在就是设置文件中字典的 KeyPath  ,通过 KeyPath 可以取得差别主题下的值  ,如:色值、图片名称、文字、字体巨细等等  。

              注重事项:

              1. 每个主题都有自己设置文件  ,包罗当地和沙盒主题  。(当地主题名叫 default) 。

              2. 主题名称与设置文件名称一致  ,如:某个主题名叫 fish  ,那么该主题响应的设置文件就应命名为fish.json  。(建议遵守该约定)

              3. 差别当地主题的切图命名要做区分  ,差别远程主题的切图命名应一致  。

              当地主题

              当地主题 ,即用户无需下载的主题  ,在 App Bundle 中  。除了 App 自己自带的默认主题外  ,SakuraKit 还能够为 App 新增多种当地主题  。

              设置步骤如下:

              步骤一

              新建 .json 设置文件 ,好比新建一个名叫 typewriter 的主题  ,因此设置文件命名为 typewriter.json  。

              步骤二

              设置一套切图  ,而且命名与已有的主题要做区分  。

              步骤三

              完成上述步骤后  ,在 AppDelegate 中 -application:application didFinishLaunchingWithOptions:launchOptions API 注册所有当地主题:

              // 注重:当地默认主题无需注册
              [TXSakuraManager registerLocalSakuraWithNames:@[@"typewriter"]];

              步骤四

              挪用切换主题 API 即可切换至该指定主题:

              [TXSakuraManager shiftSakuraWithName:@"typewriter" type:TXSakuraTypeMainBundle];

              远程主题

              远程主题(资源压缩包.zip)  ,即用户通过网络下载的主题  ,后台可动态设置  。同当地主题一致  ,分为两部门:设置文件 + 切图  。当设置文件和切图都弄好后  ,将文件夹打包成zip文件  ,传给后台即可  。主题数据花样如下(仅供参考):

              {
                  "name": "嘻多猴",
                  "sakuraName": "monkey",
                  "url": "http:\\image.tingxins.cn\sakura\monkey.zip"
              }

              sakuraName 是切换主题时用的名称  ,而 url 是该主题的下载地址 。(注:若是 sakuraName 字段传空 ,那么主题的名称将默以为下载的压缩包名称

              当远程主题下载完毕后  ,可以这样切换主题:

              [TXSakuraManager shiftSakuraWithName:sakuraName type:TXSakuraTypeSandBox];

              值得一提的是  ,SakuraKit 提供了一些主题下载的简朴接口  ,支持多种主题同时下载等操作  ,而且支持 Block 和 Delegate 两种方式的回调  ,同时用户还可自界说下载操作  。

              下面我们来依次先容一下主题下载  。

              Block 方式

              我们直接来先容 API :

              [[TXSakuraManager manager] tx_sakuraDownloadWithInfos:sakuraModel downloadProgressHandler:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
                  // 下载进度回调
              } downloadErrorHandler:^(NSError * _Nullable error) {
                  // 下载历程泛起错误回调
              } unzipProgressHandler:^(unsigned long long loaded, unsigned long long total) {
                  // 主题下载完成后  ,解压进度回调
              } completedHandler:^(id _Nullable infos, NSURL * _Nullable location) {
                  // 主题包解压完毕回调
              } ];

              其中 sakuraModel 模子数据遵守了 TXSakuraDownloadProtocol 协议 ,详细使用详见 SakuraDemo_OC  ,在 DownloadSakuraController 控制器演示了该操作  。

              Delegate 方式

              步骤一

              直接挪用 API 实现主题下载:

              [[TXSakuraManager manager] tx_sakuraDownloadWithInfos:sakuraModel delegate:self];

              步骤二

              若是针对步骤一的下载操作需要回调  ,那么可以选择性的再实现以下要领:

              // 重复点击下载某一主题 ,若是该主题已经处于下载中或者当地存在时将会回调 ,其中 status 标识该 downloadTask 状态 。
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                               downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                     status:(TXSakuraDownloadTaskStatus)status;
              // 主题下载完毕时回调  ,其中 infos 包罗主题名称  ,可通过该参数直接切换至该主题
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                               downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                sakuraInfos:(id)infos
                  didFinishDownloadingToURL:(NSURL *)location;
              // 主题下载进度
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                              downloadTask:(NSURLSessionDownloadTask *)downloadTask
                              didWriteData:(int64_t)bytesWritten
                         totalBytesWritten:(int64_t)totalBytesWritten
                 totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
              /** Reserved for future use */
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                              downloadTask:(NSURLSessionDownloadTask *)downloadTask
                         didResumeAtOffset:(int64_t)fileOffset
                        expectedTotalBytes:(int64_t)expectedTotalBytes;
              // 下载操作泛起错误时回调
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                               sessionTask:(NSURLSessionTask *)downloadTask
                      didCompleteWithError:(nullable NSError *)error;
              // 主题下载包解压进度回调
              - (void)sakuraManagerDownload:(TXSakuraManager *)manager
                               downloadTask:(NSURLSessionDownloadTask *)downloadTask
                              progressEvent:(unsigned long long)loaded
                                      total:(unsigned long long)total;

              详细使用详见 SakuraDemo_OC  ,在 AppDelegate 中演示了该操作  。

              自界说下载操作

              除了上述自带的下载操作外  ,SakuraKit 还提供了自界说下载操作相关的 API :

              // sakuraModel 模子数据遵守了 TXSakuraDownloadProtocol 协议  ,location 即自界说下载下来的主题包地址  。
              [[TXSakuraManager manager] tx_generatePathWithInfos:sakuraModel downloadFileLocalURL:location successHandler:^(NSString *toFilePath, NSString *sakuraPath, TXSakuraName *sakuraName) {
                                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    BOOL isSuccess = [SSZipArchive unzipFileAtPath:toFilePath toDestination:sakuraPath delegate:self];
                    // 注重:自界说下载操作  ,必须举行 Sakura 路径花样化  !Required !
                    [TXSakuraManager formatSakuraPath:sakuraPath cleanCachePath:toFilePath];
                   
                    dispatch_sync(dispatch_get_main_queue(), ^{
                        if (isSuccess) {
                            [TXSakuraManager shiftSakuraWithName:sakuraName type:TXSakuraTypeSandBox];
                        }
                    });
                 });
              } errorHandler:^(NSError * _Nullable error) {
                 NSLog(@"errorDescription:%@",error);
              }];

              FQA

              1.为何每个主题都有自己设置文件  ?

              答:由于每个主题 ,除了切图的命名是是一致的外  ,差别的主题配景色、字体巨细可能纷歧样  ,因此  ,每个主题都要有自己的设置文件  ,除非只对切图举行当地化  。

              2.为何主题名称与设置文件名称一致 ?

              答:这只是一个约定  ,SakuraKit 会通过主题名称找到该主题在当地或者在沙盒中的路径  ,使得主题名称与设置文件名称一致  ,可以淘汰不须要的事情量  。

              3.当地与沙盒主题有什么区别  ?

              答:在当地主题称为 mainBundle 主题  ,远程主题称为 Sandbox 主题  。

              开源

              关于 SakuraKit 详细使用  ,详见 Demo  。

              GitHub 项目地址:https://github.com/tingxins/SakuraKit

              有什么问题或者更好的建议  ,GitHub 上直接提 issue 或者 PR 。谢谢支持