關於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  (我沒有用過  不知道能不能用 好不好用)

網上應該有這種第三方庫可以用一下  

 

當然還有的是把所有界面繼承自一個基類  然后改變夜間模式的話就改變這個基類的背景色  這種方法應該也是可行的  但是應該是相當相當麻煩的  需要注意的界面特多特細

 

以上就是要分享的內容  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM