zoukankan      html  css  js  c++  java
  • 关于app夜间模式那点事

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

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

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

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

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

    做法:整个app设计两套UI界面、分别对应的白天和夜间的页面颜色、字体。当用户启动夜间模式的时候,调用夜晚的UI界面。

    比如网易新闻、腾讯新闻:你可以发现他的字体颜色  背景颜色都是不一样的  显然这是有两套UI方案

    这个方法虽然效果好  但是存在以下问题:

    • 设计、切图成本大,需要对整个客户端的所有页面都设计两套UI界面,设计部门压力大
    • 达到开发以后开发和适配的难度大,实现成本高
    • 并且后期版本迭代的时候都需要设计和开发两套页面,成本之巨。小型开发团队负担很重。

    所以这次我没有选用这个方法  而是选用了一个效果差 但方法简单的做法:

    效果如下:

    这只是一个投机取巧的办法  字体颜色和背景颜色并没有改变  只是在选用夜间模式后在顶部增加了一层黑透明背景    这种方法开发成本地  易维护  就是效果差了点

    具体方法如下:

    首先创建一个黑色透明的VIew  位置大小和屏幕大小一致   添加到最顶层:

     1 //增加夜间模式的视图
     2 
     3     UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIApplication sharedApplication].keyWindow.bounds.size.width, [UIApplication sharedApplication].keyWindow.bounds.size.height)];
     4     
     5     if(self.topView){//防止之前有 重复添加的情况
     6         [self.topView removeFromSuperview];
     7     }
     8     self.topView = topView;
     9     //黑色透明view不处理时间  把事件交给subViews处理
    10     topView.userInteractionEnabled = NO;
    11     topView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4];
    12 //    topView.hidden = [;
    13     //读取夜间模式状态
    14     NSString *nightStatus = [[NSUserDefaults standardUserDefaults]objectForKey:@"nightStatus"];
    15     if (nightStatus == nil || [nightStatus isEqualToString:@"day"] || nightStatus.length == 0) {
    16         self.topView.hidden = YES;
    17     }else{
    18         self.topView.hidden = NO;
    19     }
    20     
    21     
    22     [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 == 1) {//夜间模式
                nightStatusStr = @"night";
                tabCon.topView.hidden = NO;
            }else if (top.on == 0) {//白天模式)
                nightStatusStr = @"day";
                tabCon.topView.hidden = YES;
            }
            //将这个的版本号存储在沙盒里,key就是1>读取沙盒信息的那个key
            [[NSUserDefaults standardUserDefaults] setObject:nightStatusStr forKey:@"nightStatus"];
            [[NSUserDefaults standardUserDefaults]synchronize];//立即同步
        });
    
    }

    这里主要做两件事:

    一个是根据状态显示或关闭黑色view(当然  这个通过通知或者代理也可以实现)  第二个就是存储最新的状态

    然后在这个控制器里还要注意按钮的默认状态:

    1     //读取上次的夜间模式状态
    2     NSString *nightStatus = [[NSUserDefaults standardUserDefaults]objectForKey:@"nightStatus"];
    3     if (nightStatus == nil || [nightStatus isEqualToString:@"day"] || nightStatus.length == 0) {
    4         self.nightSwitch.on = NO;
    5     }else{
    6           self.nightSwitch.on = YES;
    7     }

    大致的路程就是这样了  到时候再根据自己想要的效果进行调整

    当然还有其他方法  比如说利用第三方库  比如说

    DKNightVersion  (我没有用过  不知道能不能用 好不好用)

    网上应该有这种第三方库可以用一下  

    当然还有的是把所有界面继承自一个基类  然后改变夜间模式的话就改变这个基类的背景色  这种方法应该也是可行的  但是应该是相当相当麻烦的  需要注意的界面特多特细

    以上就是要分享的内容  

  • 相关阅读:
    自定义指令directive
    angular中的表单验证
    ng-init,ng-controller,ng-model
    Redis执行lua脚本,key不存在的返回值
    消息队列对比
    数据库设计范式
    网络IO模型
    .NET 线程、线程池
    异步和多线程
    Memcache知识点
  • 原文地址:https://www.cnblogs.com/gaoxiaoniu/p/6528694.html
Copyright © 2011-2022 走看看