首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

iOS 狀態欄完整指南:隱藏、樣式、背景色與進階控制技巧

     編輯:Java 相關知識

iOS 狀態欄控制全解析

在 iOS 開發中,狀態欄是用戶界面的重要組成部分。本文將系統整理狀態欄的隱藏控制、樣式切換、背景色設置以及巢狀導航控制器中的進階應用技巧,幫助開發者靈活掌握狀態欄行為。

一、狀態欄隱藏的兩種方案

方案一:程式碼控制(已棄用)

早期可透過 UIApplication 的 statusBarHidden 屬性或 setStatusBarHidden:animated: 方法控制,但 Apple 明確警告:若應用使用預設的 UIViewController-based 狀態欄系統,這些設置將無效。iOS 9 後這些 API 已標記棄用,雖仍可調用但會產生警告。

方案二:Info.plist 配合 UIViewController 覆寫(推薦)

現代做法需在 Info.plist 設定 View controller-based status bar appearance = YES(預設值),然後在各 UIViewController 子類中覆寫:

- (BOOL)prefersStatusBarHidden {
    return YES; // 或 NO
}

此方式可讓每個視圖控制器獨立決定狀態欄顯示狀態,符合 iOS 7+ 設計哲學。

二、狀態欄樣式切換

主要有三種樣式:

  • UIStatusBarStyleDefault:深色文字,適合淺色背景
  • UIStatusBarStyleLightContent:白色文字,適合深色背景
  • UIStatusBarStyleBlackTranslucent/Opaque:iOS 7 前版本,現已棄用合併為 LightContent

同樣建議在 UIViewController 中覆寫 preferredStatusBarStyle:

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

三、狀態欄背景色處理

iOS 7 後狀態欄預設透明,常見兩種著色方案:

  1. 自建 UIView 覆蓋狀態欄區域,完全自訂顏色
  2. 設置 navigationBar.barTintColor,導航欄顏色會延伸至狀態欄

四、巢狀 UINavigationController 進階控制

當視圖控制器嵌入導航控制器時,直接覆寫 preferredStatusBarStyle 往往失效。原因在於系統優先查詢 UINavigationController 的 childViewControllerForStatusBarStyle,預設返回 nil 導致使用導航控制器自身樣式。

解決方案:自訂 NavigationController 子類

@interface CustomNavigationController : UINavigationController
@end

@implementation CustomNavigationController
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController; // 返回當前頂層 VC
}
@end

同理適用於 childViewControllerForStatusBarHidden 控制隱藏邏輯。

五、狀態欄動畫與自訂

  • preferredStatusBarUpdateAnimation:控制狀態變更動畫(Fade、Slide、None)
  • 需搭配 [self setNeedsStatusBarAppearanceUpdate] 觸發重繪
  • 進階應用:隱藏系統狀態欄,自建 UIWindow 並設 windowLevel = UIWindowLevelStatusBar 實現完全自訂狀態欄

總結

掌握「View Controller-based」機制是核心:在各 VC 覆寫 prefers 系列方法,配合自訂 NavigationController 轉發查詢,即可優雅解決所有狀態欄控制需求。建議拋棄舊式 UIApplication API,擁抱現代 iOS 架構設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved