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

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

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

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

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

做法:整个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. 8 Mistakes to Avoid while Using RxSwift. Part 1

    Part 1: not disposing a subscription Judging by the number of talks, articles and discussions relate ...

  2. VFS文件系统结构分析 与socket

    本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,并注明原作者及原链接.内容可任意使用,但对因使用该内容引起的后果不做任何保证. 作者:fireaxe_hq@ho ...

  3. js 目录树

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. C51端口结构和工作原理(转)

    一.P0端口的结构及工作原理 P0端口8位中的一位结构图见下图:   由上图可见,P0端口由锁存器.输入缓冲器.切换开关.一个与非门.一个与门及场效应管驱动电路构成.再看图的右边,标号为P0.X引脚的 ...

  5. SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用

    SciSharp Cube 在Docker容器中快速体验SciSharp机器学习工具的最新功能. 项目地址:https://github.com/SciSharp/SciSharpCube 从Dock ...

  6. 服务器安装ESXI6.5系统

    服务器做raid5磁盘冗余配置步骤 1.打开服务器电源,进入服务器启动界面,按下F10后回车,等待服务器回应你的操作进入下一个页面 提示:  在进入服务启动页面,在页面的最下方就可以看到F9,F10, ...

  7. python之异常处理模块

    一 . python 内置的异常类 在程序运行过程中,如果出现错误,python解释器会创建一个异常对象,并抛出给系统运行时.即程序终止正常执行流程,转而执行异常处理流程. 在某种特殊条件下,代码中也 ...

  8. 通过js 实现 向页面插入js代码并生效,和页面postMessage通讯

       此文章针对已经搭建好jenkins和会使用iconfont图标库而写. 主要目标就是在不通过更改html文件,完成页面交互图标信息,因为美工最多可以上传代码并且自动发布,并不会在Html中加入我 ...

  9. GCJ 2008 Round 1A Minimum Scalar Product( 水 )

    链接:传送门 题意:给两个向量 v1 = { x1 , x2 , x3 , x4 .... } , v2 = { y1 , y2 , y3 , y4 ...... } 允许任意交换 v1 和 v2 各 ...

  10. 训练1-R

    给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 = ...