大半年没写过代码了 一直在忙一些其他的事情  这几天想起来看了一点  心惊肉跳的 发现好陌生  所以打算今后慢慢的拾起来  往深度和广度去发展

发现好久之前写的一个微博项目  有一个夜间模式的功能没有实现  其实这个功能挺实用的  应用很广

  晚上关灯后还是有不少人在看手机  夜间模式可以一定程度上减少对眼睛的刺激  提高用户好感

   要实现这个效果有两到三种方法  不同的方法可能效果差不多  但是仔细端详的话 也可以看出来差别

第一种是效果比较好的 但是比较麻烦的

做法:整个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夜间模式那点事的更多相关文章

  1. ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例

    工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说 ...

  2. android夜间模式实现

    一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...

  3. DKNightVersion 的实现 --- 如何为 iOS 应用添加夜间模式

    在很多重阅读或者需要在夜间观看的软件其实都会把夜间模式当做一个 App 所需要具备的特性. 而如何在不改变原有的架构, 甚至不改变原有的代码的基础上, 就能为应用优雅地添加夜间模式就成为一个在很多应用 ...

  4. android简单的夜间模式

    现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...

  5. Android白天/夜间模式Day/Night Mode标准原生SDK实现

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...

  6. app 性能优化的那些事(二)

    来源:树下的老男孩 链接:http://www.jianshu.com/p/2a01e5e2141f 这次我们来说说iOS app中滑动的那些事.iOS为了提高滑动的流畅感,特意在滑动的时候将runl ...

  7. Android 之夜间模式(多主题)的实现

    引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...

  8. 如何通过 HSB 颜色模式构建夜间模式

    中国睡眠研究会发布的<2017 年中国青年睡眠现状报告>显示,大约 90% 的人在睡前离不开电子产品. 不知道大家有没有感觉到普通的亮色界面会让我们在夜间使用的时侯感到刺眼,长时间使用会感 ...

  9. Android实现夜间模式

    如今非常多App都有夜间模式,特别是阅读类的App.夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用An ...

随机推荐

  1. 资源帖:CV代码库搜集

    2013计算机视觉代码合集一: 原文链接:http://www.yuanyong.org/blog/cv/cv-code-one 切记:一定要看原文链接 原文链接: http://blog.csdn. ...

  2. 怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.

    方法一:1 <script type="text/javascript"> $(function() { $("#toggle").click(fu ...

  3. centos7常见的操作01 UTC CST

      CentOS系统将UTC时间修改为CST时间方法 2018-10-31 07:51 世界协调时间(Universal Time Coordinated,UTC): GPS 系统中有两种时间区分,一 ...

  4. 获取Centos7安装Docker各种姿势(指定版本)(转载)

    Centos7安装docker社区(CE)版 官网指导:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#inst ...

  5. 找到多个与名为“HOME”的控制器匹配的类型。如果为此请求(“{CONTROLLER}/{ACTION}/{ID}”)提供服务的路由在搜索匹配此请求的控制器时没有指定命名空间,则会发生此情况。如果是这样,请通过调用含有“NAMESPACES”参数的“MAPROUTE”方法的重载来注册此路由。

    public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/ ...

  6. 自我介绍About me

    我的github:www.github.com/dcdcbigbig 欢迎来加star!(雾) tm就是个菜逼

  7. css实现三栏水平布局双飞翼与圣杯布局

    作为布局的入门级选手,网上也查看了很多信息和资源 双飞翼的html结构 <div class="container"> <div class="main ...

  8. 洛谷P1914 小书童——密码

    题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且密码是由 ...

  9. Linux中的gpio口使用方法

    Linux中的IO使用方法 应该是新版本内核才有的方法.请参考:./Documentation/gpio.txt文件 提供的API:驱动需要包含 #include <linux/gpio.h&g ...

  10. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclips

    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclips ...