投资证券的小伙伴儿,应该非常熟悉很多 App 的夜间模式。打开夜间模式时,App 所有的页面由白色变为黑色,这样做有两个好处:一个是可以保护眼睛;另一个是相关的红绿行情图像,也显得更加协调。Android 上称这种夜间/白天模式为「主题切换」, 实现方式大都是通过更改 Resource 文件夹的路径来实现。 作为一个iOS App 开发者, 如何实现这种主题切换的功能呢?

GitHub 上面,star 最多的是叫  DKNightVersion 的开源库,内部原理是通过 Notification 的方式, 在 UIView 中监听通知变化,切换不同的主题颜色。也有一些其他的开源库,但是底层无一例外都使用了通知来实现。

结合自己的项目,我想出了另外一种实现方式,原理如下:

iOS 切换主题.png

项目采用通常的 TabBarController 的展示方式。通过 SettingManager 管理 plist 文件,plist 中对应了不同主题的颜色。项目中所有 UIView 对象的颜色均通过 SettingManager 来设置。当切换不同主题时,通过 SettingManager 读取 plist 中对应的不同颜色值。

上述方案的顺利实现,还需要以下 2 个细节:

1 TabBarController 需要由 UINavigationController 包装一层,然后 UINavigationController 作为 window 的 rootViewController.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];    self.window.backgroundColor = [UIColor whiteColor];

UIStoryboard *storyBoard =  [UIStoryboard storyboardWithName:@"Main" bundle:nil];

ZDTabBarController *tabBarC = [storyBoard instantiateInitialViewController];

tabBarC.view.backgroundColor = [UIColor themeColor];

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:tabBarC];

nav.navigationBar.hidden = true;    self.window.rootViewController = nav;

[self.window makeKeyAndVisible];

return YES;

}

2  Setting 页面需要以 pop 的方式弹出;与原来的 TabBarController 的 UINavigationController 相互独立;- (void)btnClick_start{

MTSettingsViewController *settingsVC = [[MTSettingsViewController alloc] init];

[settingsVC configuePushStyle:(PushStylePush)];

[settingsVC show:self.navigationController];

}

有了以上两点儿的设计,在切换主题时,通过重新生成 TabBarController , 作为 UINavigationController 的 subViewControllers。+ (void)configueTheme:(ThemeStyle) themeStyle rootViewController:(UIViewController *)vc completion:(void (^ __nullable)(void))completion{    NSMutableDictionary *settingData = [[NSMutableDictionary alloc] initWithContentsOfFile:[self shareManager].plistPath];

[settingData setValue:[NSNumber numberWithInteger:themeStyle] forKey:ThemeStyleKey];

[settingData writeToFile:[self shareManager].plistPath atomically:true];

UINavigationController *nav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;

[nav setViewControllers:@[vc]];

if (completion) {

completion();

}

}

作者:uniapp

链接:https://www.jianshu.com/p/2b9090a00175

ios 主题切换 思路_iOS 实现主题切换的最佳方案相关推荐

  1. ios 主题切换 思路_iOS 使用 NSObject 的分类实现快速切换主题

    PYTheme An easy way to change theme through NSObject's category for iOS. 通过 NSObject 的分类实现使用简单的主题更换. ...

  2. ios 主题切换 思路_iOS主题皮肤切换

    如果您的企业已启用企业统一身份认证,请在企业内部系统修改密码. 切换企业 点击消息列表界面的"切换企业/组织",方便快速切换企业/组织."切换企业/组织"及企业 ...

  3. ios 主题切换 思路_IOS主题切换ThemeManager

    #import "ThemeManager.h" #define kDefaultThemeName   @"默认主题" #define kThemeName  ...

  4. iOS Sprite Kit教程之场景的切换

    iOS Sprite Kit教程之场景的切换 Sprite Kit中切换场景 每一个场景都不是单独存在的.玩家可以从一个场景中切换到另外一个场景中.本小节,我们来讲解场景切换.在每一个游戏中都会使用到 ...

  5. iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

    iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍) 本来仅仅是打算介绍一下addChildViewController这种方法的,正好今天朋友去换工作面试问 ...

  6. 三人英语计算机主题口语对话,计算机英语Web Quest主题教学思路(共3641字).doc

    计算机英语Web Quest主题教学思路(共3641字) 计算机英语Web Quest主题教学思路(共3641字) 计算机英语课程教学长期以来采用以教师为主的传统教学模式,教学方法多为讲授法,教学组织 ...

  7. 多套主题怎么灵动换肤?APP换肤方案详细解析!

    背景需求 目前Android APP换肤大体可分为两大类: 两套主题的切换(比如白天/黑夜),使用一个开关按钮进行切换. 多套主题在线下载并更新. 第一种的实现基本上使用设置本地Theme来操作,即将 ...

  8. 谷歌浏览器有哪些好看的主题_Kibou 简洁的Typecho主题

    一款基于 Bootstrap 的单栏的简洁的自适应Typecho主题.这是一款开发于17年的Typecho主题,如果您喜欢简洁的单栏主题,那么这款主题会是您不错的选择 Kibou 是一款基于 Boot ...

  9. jquery ui 主题_使用jQuery UI主题

    主题不是一个新概念. 您可能已经使用级联样式表(CSS)样式和类推出了一些样式,以格式化网站的外观. 使用框架可以使方法标准化,并减少需要编写的工作量和代码量. jQuery UI现在是主题实现的行业 ...

最新文章

  1. 新品秀:Dell Cast,让Android平板变身台式PC
  2. Linux笔记:认识shell
  3. tomcat两个项目冲突
  4. IEnumerable和IEnumerator
  5. 成为嵌入式高手,少不了这100多个软硬件开源项目!
  6. 什么是浏览器?2、常见的主流浏览器及其内核?什么是服务器?(学习笔记)
  7. 1124 Raffle for Weibo Followers
  8. 伦敦 quant_伦敦统一用户组11
  9. 【Python】个人所得税
  10. 使用KMS批量激活操作系统
  11. 他晒了一张奶酪照片,被判入狱13年半
  12. 小程序笔记(四)发表评论或者普通发帖
  13. JS高频面试题,请查阅,务必收藏持续更新
  14. HTML中的format函数是干嘛的,css format是什么意思?
  15. 这几种母乳才不能吃,“隔夜”的母乳不能吃?那是对母乳不够了解
  16. python 视频抽帧_一种用于超高帧频图像流到标准模拟视频流转换的抽帧方法与流程...
  17. 计算机系统(五):计算机网络和因特网
  18. 转载:如何与老板谈加薪
  19. 【AnySDK】目前对外开放的渠道列表
  20. 计算机毕业设计ssm基于Java的城市公交查询系统ac5p2系统+程序+源码+lw+远程部署

热门文章

  1. JS JQuery添加、替换、删除元素class属性
  2. 光伏电站清扫机器人_光伏清扫机器人(GF01B)
  3. JupyterLab 常用配置
  4. 绝杀慕尼黑_慕尼黑如何将15,000台PC从Windows切换到Linux
  5. PHP超精简自适应小说源码
  6. 网络安全系列-五十一:网络流量威胁监测系统的方案选择
  7. [转载]好莱坞故事创意手册!
  8. Google未来半年内的杀手锏预测
  9. 剥离war3.exe 启动游戏实现
  10. SUB1GHz DP4301无线收发芯片可兼容CC1101 无线烟感/门磁报警等领域芯片选型