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上哦!
相關文章
- iOS 修改狀態列StatusBar的顏色及文字顏色iOS
- [置頂] IOS7狀態列StatusBar官方標準適配方法iOS
- C++ Qt開發:StatusBar底部狀態列元件C++QT元件
- C/C++ Qt StatusBar 底部狀態列應用C++QT
- iOS 狀態列的圖示iOS
- iOS隱藏狀態列iOS
- 陣列的靈活使用陣列
- iOS狀態列相關操作iOS
- IOS設定狀態列的背景顏色iOS
- iOS狀態列和導航欄的設定iOS
- 【iOS開發】強制修改iOS狀態列顏色iOS
- c#之statusstrip狀態列控制元件(1)C#控制元件
- 如何控制手機網站控制狀態列顯示樣式網站
- iOS之StatusBar詳解iOS
- ios開發筆記--狀態列的自定義,隱藏iOS筆記
- [譯] iOS App 上一種靈活的路由方式iOSAPP路由
- android狀態列一體化(沉浸式狀態列)Android
- 靈活的JavaScriptJavaScript
- 關於iOS 狀態列、導航欄的幾處筆記iOS筆記
- 蘋果iOS 10來了!拯救iPhone、iPad狀態列蘋果iOSiPhoneiPad
- MFC在狀態列中使用進度條控制元件控制元件
- android狀態列一體化(改變狀態列的背景顏色)Android
- Android 沉浸式狀態列攻略 讓你的狀態列變色吧Android
- API閘道器控制靈活,支援細粒度許可權控制API
- [快速搞定]android 狀態列一體化 沉浸式狀態列Android
- 報表工具中動態引數的靈活運用
- React Native 中的狀態列React Native
- 【iOS開發】修改present出來的ViewController狀態列顏色iOSViewController
- 【iOS開發】防止UIWindow延遲釋放佔用狀態列iOSUI
- 沉浸式狀態列解析
- Android 狀態列透明Android
- 在狀態列中插入類似進度條的可視控制元件控制元件
- iOS一個靈活可擴充套件的開源Log庫iOS套件
- Flutter改變狀態列字型、狀態列背景顏色、Appbar背景顏色的方式FlutterAPP
- 學習 PixiJS — 精靈狀態JS
- iOS 雙波浪動畫 – 類似淘寶個人資訊狀態列,京東金融等iOS動畫
- iOS 高效靈活地配置可複用檢視元件的主題iOS元件
- iOS 靈活的 模組化、元件化、工具與規範、Lotusoot 解說iOS元件化