iOS狀態列相關操作

根本停不下來發表於2018-04-25

狀態列是一件很坑爹的事情,一不弄不好就會出現你不想要的結果。

修改狀態列的顏色

iOS 9

修改狀態列的顏色在 iOS 9 之前我們會這樣做:

  • 首先在.plist檔案中設定 UIViewControllerBasedStatusBarAppearanced 的值為NO。
  • 然後通過以下程式碼去控制狀態列的顏色
+ (void)statusBarColorWhite:(BOOL)isWhite
{
    [[UIApplication sharedApplication] setStatusBarStyle:isWhite ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault];
}
複製程式碼

這種方式操作起來比較簡便。

iOS 9 之後

在 iOS 9 之後上面的方式已經被遺棄了。雖然還可以用,但是會出現一個warnning,一個黃色的感嘆號會使我們這些有強迫症患者的人感到非常難受,儘管我的工程中已經有536個warnning了。
新的方法比較麻煩,但還是有道可循的。下面就是我總結的方法:

  • 首先,你要自己判斷當前的 viewController 是否有 navigationController。
  • 如果當前 viewController 不在 navigationController 中。
    這時,要修改狀態列的顏色只需要在這個viewController中重寫 - (UIStatusBarStyle)preferredStatusBarStyle 即可。
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleDefault/UIStatusBarStyleLightContent;
    }
    複製程式碼
  • 如果當前 viewController navigationController中。
    這時,要修改狀態列顏色就不能用上邊的方法了。因為你試過後就會發現這種情況下你在進入 viewController 的過程中並沒有進入到 preferredStatusBarStyle 方法裡面去。下面是可行的方法:
    • 如果要設定整個 navigationController,即整個 navigationController 的狀態列顏色都是統一的,要在 navigationController 中去重寫 - (UIStatusBarStyle)preferredStatusBarStyle
    • 如果要單獨設定某個 viewController 的狀態列顏色,那麼就需要在 viewController 的 viewWillAppear 中去設定:
      - (void)viewWillAppear:(BOOL)animated
      {
          [super viewWillAppear:animated];
          self.navigationController.navigationBar.barStyle = UIStatusBarStyleDefault;//設定狀態列為黑色
          self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;//設定狀態列為白色
          
      }
      複製程式碼

設定隱藏、顯示狀態列

  • 如果你在 .plist 檔案中設定了 UIViewControllerBasedStatusBarAppearanced 為NO。那麼你需要使用以下方法來設定:
    [[UIApplication sharedApplication] setStatusBarStyle:(UIStatusBarStyle)];
    複製程式碼
    這種設定方法是全域性設定的,如果在某特定頁面隱藏了狀態列,在需要顯示的地方就要再設定一次顯示狀態列。
    這種方法會有一個warnning。 這種設定方式可能會導致一個系統導航欄飛出螢幕之外的Bug。(別問我為什麼知道...)
  • 如果你沒有在 .plist 檔案中設定 UIViewControllerBasedStatusBarAppearanced 為NO。那麼要在 viewController 中重寫 prefersStatusBarHidden 來進行設定:
    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    複製程式碼

小結:以上兩種操作中都同意使用第二種方法會更省事。

相關文章