在 iOS 開發中,狀態欄是用戶界面的重要組成部分。本文將系統整理狀態欄的隱藏控制、樣式切換、背景色設置以及巢狀導航控制器中的進階應用技巧,幫助開發者靈活掌握狀態欄行為。
早期可透過 UIApplication 的 statusBarHidden 屬性或 setStatusBarHidden:animated: 方法控制,但 Apple 明確警告:若應用使用預設的 UIViewController-based 狀態欄系統,這些設置將無效。iOS 9 後這些 API 已標記棄用,雖仍可調用但會產生警告。
現代做法需在 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 後狀態欄預設透明,常見兩種著色方案:
UIView 覆蓋狀態欄區域,完全自訂顏色navigationBar.barTintColor,導航欄顏色會延伸至狀態欄當視圖控制器嵌入導航控制器時,直接覆寫 preferredStatusBarStyle 往往失效。原因在於系統優先查詢 UINavigationController 的 childViewControllerForStatusBarStyle,預設返回 nil 導致使用導航控制器自身樣式。
@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 架構設計。