iOS 靈活的控制狀態列StatusBar
在一個App的所有頁面中,總是會有幾個頁面的StatusBar與整體風格不一致。
比如有個特殊頁面StatusBar需要隱藏;另一個頁面StatusBar需要改為白色……
(╯°□°)╯︵┻━┻
想來每個iOS開發者都遇到過這樣的問題。
那麼,怎樣才能靈活的控制StatusBar的風格和顯示隱藏,並且在頁面之間跳轉時又不會顯得違和或突兀呢?
以這樣的專案結構為例:
- LaunchScreen頁面的StatusBar隱藏,進入App主頁後StatusBar顯示;
- 整個App採用「TabBarController -> NavigationController -> ViewController」這樣常見的結構;
- 在Push ViewController的過程中,有些頁面隱藏StatusBar,有些頁面的UIStatusBarStyle會改變
1. LaunchScreen頁面的StatusBar隱藏
只需要找到Targets -> General -> Deployment Info中的Hide status bar
,勾上左邊的勾就行了。
2. 修改info.plist配置
在info.plist中增加View controller-based status bar appearance
,並將其值設定為YES
。
這個key的含義顧名思義:StatusBar的外觀基於ViewController。
眾所周知,控制StatusBar的風格和顯示隱藏有兩種方法:
- UIApplication
UIApplication.shared.setStatusBarHidden(true, with: .slide);
UIApplication.shared.setStatusBarStyle(.default, animated: true)
- UIViewController
override var prefersStatusBarHidden: Bool {
return true
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
第一種方法在iOS9中已經被棄用了,而第二種方法是iOS7時就有的API,也是蘋果推薦使用的方式。
根據上面的兩種方法,再結合View controller-based status bar appearance
的含義,可以知道:
當設定為預設的NO
時,意為不基於ViewController,而是基於UIApplication.shared.statusBarStyle
和UIApplication.shared.isStatusBarHidden
。這時ViewController中的prefersStatusBarHidden
和preferredStatusBarStyle
也根本不會被呼叫。
當設定為YES
時,就是基於ViewController了,prefersStatusBarHidden
和preferredStatusBarStyle
將會被正常呼叫。
3. 傳遞StatusBar控制權
想要靈活的控制StatusBar,必須能夠細化到每一個ViewController都有權利控制它自己頁面上的StatusBar的外觀。
但是,prefersStatusBarHidden
和preferredStatusBarStyle
只會在keyWindow.rootViewController
中被呼叫。
在本文的App檢視結構中,就是隻會在TabBarController中被呼叫。因此,這兩個方法必須寫到TabBarController中。
那怎麼將控制權傳遞到螢幕最上方顯示的ViewController中呢?
首先,要為NavigationController和ViewController建立基類;TabBarController一般只有一個,就沒必要建立基類了,專案中存在一個子類化的UITabBarController就可以了。
然後:
TabBarController中增加如下程式碼:
// MARK: - Status Bar
override var prefersStatusBarHidden: Bool {
guard let selectedVC = selectedViewController else { return false }
return selectedVC.prefersStatusBarHidden
}
override var preferredStatusBarStyle: UIStatusBarStyle {
guard let selectedVC = selectedViewController else { return .default }
return selectedVC.preferredStatusBarStyle
}
NavigationController基類中增加如下程式碼:
// MARK: - Status Bar
override var prefersStatusBarHidden: Bool {
guard let topVC = topViewController else { return false }
return topVC.prefersStatusBarHidden
}
override var preferredStatusBarStyle: UIStatusBarStyle {
guard let topVC = topViewController else { return .default }
return topVC.preferredStatusBarStyle
}
這樣,就可以將StatusBar的控制權傳遞給螢幕最上方的ViewController了,而在ViewController的基類中,也需要增加如下程式碼,以配置預設的StatusBar外觀。
// MARK: - Status Bar
override var prefersStatusBarHidden: Bool {
// 預設顯示StatusBar
return false
}
override var preferredStatusBarStyle: UIStatusBarStyle {
// 預設風格
return .default
}
在某些特殊頁面,需要改變StatusBar的風格和顯示隱藏時,在該ViewController中override
上述兩個方法,return
合適的結果就可以了。
最後,這裡是Demo地址。使用時記得先把Scheme切換到StatusBarDemo上哦!
相關文章
- C++ Qt開發:StatusBar底部狀態列元件C++QT元件
- C/C++ Qt StatusBar 底部狀態列應用C++QT
- iOS狀態列相關操作iOS
- 陣列的靈活使用陣列
- 狀態列
- 關於iOS 狀態列、導航欄的幾處筆記iOS筆記
- 創業者需要的品質:靈活!靈活!靈活創業
- [譯] iOS App 上一種靈活的路由方式iOSAPP路由
- 學習 PixiJS — 精靈狀態JS
- React Native 中的狀態列React Native
- 沉浸式狀態列
- 狀態列相關
- Android 狀態列透明Android
- Flutter改變狀態列字型、狀態列背景顏色、Appbar背景顏色的方式FlutterAPP
- API閘道器控制靈活,支援細粒度許可權控制API
- iOS一個靈活可擴充套件的開源Log庫iOS套件
- 05@多用列舉表示狀態、選項、狀態碼
- Android 沉浸式狀態列的實現Android
- 報表工具中動態引數的靈活運用
- Fiddler的靈活使用
- Android獲取狀態列高度Android
- react-native android狀態列ReactAndroid
- 狀態列Theme相關配置
- PyQt5 之狀態列QT
- Android全屏與透明狀態列Android
- HTTP狀態碼列舉(PHP)HTTPPHP
- iOS 高效靈活地配置可複用檢視元件的主題iOS元件
- Android-沉浸式狀態列的實現Android
- Linux下共享VG改變活動狀態Linux
- win10怎麼把狀態列變透明_win10狀態列變透明方法Win10
- MUI——設定沉浸式狀態列UI
- Qt 狀態列消除白色豎線QT
- Android 隱藏系統狀態列Android
- 抓包整理外篇——————狀態列[ 四]
- 使用列舉實現狀態機來優雅你的狀態變更邏輯
- 小程式生態是更靈活構建超級App的方式APP
- 曠視科技提出TextSnake:一個檢測任意形狀文字的靈活表徵
- 關於 Android 狀態列的適配總結Android