关于app夜间模式那点事
大半年没写过代码了 一直在忙一些其他的事情 这几天想起来看了一点 心惊肉跳的 发现好陌生 所以打算今后慢慢的拾起来 往深度和广度去发展
发现好久之前写的一个微博项目 有一个夜间模式的功能没有实现 其实这个功能挺实用的 应用很广
晚上关灯后还是有不少人在看手机 夜间模式可以一定程度上减少对眼睛的刺激 提高用户好感
要实现这个效果有两到三种方法 不同的方法可能效果差不多 但是仔细端详的话 也可以看出来差别
第一种是效果比较好的 但是比较麻烦的
做法:整个app设计两套UI界面、分别对应的白天和夜间的页面颜色、字体。当用户启动夜间模式的时候,调用夜晚的UI界面。
比如网易新闻、腾讯新闻:你可以发现他的字体颜色 背景颜色都是不一样的 显然这是有两套UI方案

这个方法虽然效果好 但是存在以下问题:
- 设计、切图成本大,需要对整个客户端的所有页面都设计两套UI界面,设计部门压力大
- 达到开发以后开发和适配的难度大,实现成本高
- 并且后期版本迭代的时候都需要设计和开发两套页面,成本之巨。小型开发团队负担很重。
所以这次我没有选用这个方法 而是选用了一个效果差 但方法简单的做法:
效果如下:

这只是一个投机取巧的办法 字体颜色和背景颜色并没有改变 只是在选用夜间模式后在顶部增加了一层黑透明背景 这种方法开发成本地 易维护 就是效果差了点
具体方法如下:
首先创建一个黑色透明的VIew 位置大小和屏幕大小一致 添加到最顶层:
//增加夜间模式的视图
UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(, , [UIApplication sharedApplication].keyWindow.bounds.size.width, [UIApplication sharedApplication].keyWindow.bounds.size.height)];
if(self.topView){//防止之前有 重复添加的情况
[self.topView removeFromSuperview];
}
self.topView = topView;
//黑色透明view不处理时间 把事件交给subViews处理
topView.userInteractionEnabled = NO;
topView.backgroundColor = [UIColor colorWithRed: green: blue: alpha:0.4];
// topView.hidden = [;
//读取夜间模式状态
NSString *nightStatus = [[NSUserDefaults standardUserDefaults]objectForKey:@"nightStatus"];
if (nightStatus == nil || [nightStatus isEqualToString:@"day"] || nightStatus.length == ) {
self.topView.hidden = YES;
}else{
self.topView.hidden = NO;
}
[self.view addSubview:topView];
这里需要注意几点 :
1:黑色透明view只是一个黑色显示效果 不处理时间 把时间交给subViews去处理;
2: 要注意重复创建 重复添加的情况 不仅是黑色View还有控制器的单粒问题;
3: 要注意状态的存储的读取;
默认情况下是不显示黑色VIEW的 如果推出之前设置为夜间模式 则显示
然后接下来是选择按钮这边的处理了:
[self.nightSwitch addTarget:self action:@selector(changeTopStatus:) forControlEvents:UIControlEventValueChanged];
为选择按钮增加一个处理事件 监听按钮的选择
然后根据按钮的状态变化做出处理:
//调整夜间模式
- (void)changeTopStatus:(UISwitch *)top {
NSLog(@"switch--%d",top.on); [MBProgressHUD showMessage:@"设置中"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUD];
NSString *nightStatusStr = @"";
BOSSTabBarController *tabCon = [UIApplication sharedApplication].keyWindow.rootViewController;
if (top.on == ) {//夜间模式
nightStatusStr = @"night";
tabCon.topView.hidden = NO;
}else if (top.on == ) {//白天模式)
nightStatusStr = @"day";
tabCon.topView.hidden = YES;
}
//将这个的版本号存储在沙盒里,key就是1>读取沙盒信息的那个key
[[NSUserDefaults standardUserDefaults] setObject:nightStatusStr forKey:@"nightStatus"];
[[NSUserDefaults standardUserDefaults]synchronize];//立即同步
}); }
这里主要做两件事:
一个是根据状态显示或关闭黑色view(当然 这个通过通知或者代理也可以实现) 第二个就是存储最新的状态
然后在这个控制器里还要注意按钮的默认状态:
//读取上次的夜间模式状态
NSString *nightStatus = [[NSUserDefaults standardUserDefaults]objectForKey:@"nightStatus"];
if (nightStatus == nil || [nightStatus isEqualToString:@"day"] || nightStatus.length == ) {
self.nightSwitch.on = NO;
}else{
self.nightSwitch.on = YES;
}
大致的路程就是这样了 到时候再根据自己想要的效果进行调整
当然还有其他方法 比如说利用第三方库 比如说
DKNightVersion (我没有用过 不知道能不能用 好不好用)
网上应该有这种第三方库可以用一下
当然还有的是把所有界面继承自一个基类 然后改变夜间模式的话就改变这个基类的背景色 这种方法应该也是可行的 但是应该是相当相当麻烦的 需要注意的界面特多特细
以上就是要分享的内容
关于app夜间模式那点事的更多相关文章
- ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例
工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说 ...
- android夜间模式实现
一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...
- DKNightVersion 的实现 --- 如何为 iOS 应用添加夜间模式
在很多重阅读或者需要在夜间观看的软件其实都会把夜间模式当做一个 App 所需要具备的特性. 而如何在不改变原有的架构, 甚至不改变原有的代码的基础上, 就能为应用优雅地添加夜间模式就成为一个在很多应用 ...
- android简单的夜间模式
现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...
- Android白天/夜间模式Day/Night Mode标准原生SDK实现
Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...
- app 性能优化的那些事(二)
来源:树下的老男孩 链接:http://www.jianshu.com/p/2a01e5e2141f 这次我们来说说iOS app中滑动的那些事.iOS为了提高滑动的流畅感,特意在滑动的时候将runl ...
- Android 之夜间模式(多主题)的实现
引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...
- 如何通过 HSB 颜色模式构建夜间模式
中国睡眠研究会发布的<2017 年中国青年睡眠现状报告>显示,大约 90% 的人在睡前离不开电子产品. 不知道大家有没有感觉到普通的亮色界面会让我们在夜间使用的时侯感到刺眼,长时间使用会感 ...
- Android实现夜间模式
如今非常多App都有夜间模式,特别是阅读类的App.夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用An ...
随机推荐
- TortoiseSvn问题研究(一)
问题描述 今天在工作中遇到一个SVN方面的问题,牵扯出使用SVN这一段时间的一系列问题. 具体来说,是这样的: 上周五有上线分支,自己的分支需要merge: 很多项目小组都在开发这个项目,再往前好像也 ...
- JavaScript Math 对象常用方法
Math.abs(x):可返回数的绝对值 Math.ceil(x):向上取整 Math.floor(x):向下取整 Math.max(x,y):最大值 Math.min(x,y):最小值 Math.r ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
http://www.cnblogs.com/wuhuacong/p/3352016.html 在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的 ...
- BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)
题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...
- [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)
题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a ...
- Git学习笔记(1)
1.安装Git: 在linux下安装:yum install git 其他系统安装在这里略去~~~ 安装完成后,需要设置一下,在命令行输入以下命令: [root@xwq ~]# git config ...
- Python复利
Python复利 复利的计算是对本金及其产生的利息一并计算,也就是利上有利. 复利计算的特点是:把上期末的本利和作为下一期的本金,在计算时每一期本金的数额是不同的.复利的计算公式是: s = 0 ...
- js获取日期当天的开始时间和结束时间
//函数调用传参格式为 2018-6-6或者2018.6.6//如:startUnix(2018-6-6) 返回的时间戳格式‘1528300799’ function startUnix($date) ...
- 00069_DateFormate
1.DateFormate类概述 (1)DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间.日期/时间格式化子类(如 SimpleDateFormat类) ...
- C#中的LINQ 基础
1.LINQ的数据源 必须可枚举的,即必须是数组或者集合 (继承了IEnumerable<T>接口就可以,注意是IEnumerable<T>,不是IEnumerable接口,不 ...