大半年沒寫過代碼了 一直在忙一些其他的事情 這幾天想起來看了一點 心驚肉跳的 發現好陌生 所以打算今后慢慢的拾起來 往深度和廣度去發展
發現好久之前寫的一個微博項目 有一個夜間模式的功能沒有實現 其實這個功能挺實用的 應用很廣
晚上關燈后還是有不少人在看手機 夜間模式可以一定程度上減少對眼睛的刺激 提高用戶好感
要實現這個效果有兩到三種方法 不同的方法可能效果差不多 但是仔細端詳的話 也可以看出來差別
第一種是效果比較好的 但是比較麻煩的
做法:整個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 (我沒有用過 不知道能不能用 好不好用)
網上應該有這種第三方庫可以用一下
當然還有的是把所有界面繼承自一個基類 然后改變夜間模式的話就改變這個基類的背景色 這種方法應該也是可行的 但是應該是相當相當麻煩的 需要注意的界面特多特細
以上就是要分享的內容