iOS10: 使用 UITabBarController() 时隐藏状态栏
iOS10: Hide status bar when using a UITabBarController()
我有一个 UITabBarController()
,我在 AppDelegate
中使用和分配:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
showTabBar()
return true
}
func showTabBar() {
let tabBarVC = TabBarVC()
if let window = self.window {
window.rootViewController = tabBarVC
}
}
我在 info.plist
中有以下键:
在我的 Target
下 General
,我有以下设置:
我在其中一个选项卡中使用以下代码来隐藏状态栏:
class ViewController: UIViewController {
var statusBarShouldBeHidden = false
override func viewDidLoad() {
super.viewDidLoad()
}
override var prefersStatusBarHidden: Bool {
return statusBarShouldBeHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
@IBAction func buttonHideShowStatusBarTapped(_ sender: UIButton) {
statusBarShouldBeHidden = !statusBarShouldBeHidden
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
print("animating")
}
}
}
点击按钮时,"animating" 打印在日志中;但是,状态栏不会隐藏。
我不确定这是否与 UITabBarController()
有关,但上面的代码似乎在没有它的项目中也能正常工作。
如何在使用UITabBarController()
时隐藏iOS10中的状态栏?
您需要在您的根视图控制器中 setNeedsStatusBarAppearanceUpdate()
,即 TabBarVC
。这是解决方案:
将 TabBarVC
中的 prefersStatusBarHidden
覆盖为 selectedViewController
的 return 值
override var prefersStatusBarHidden: Bool {
return mainTabBarController.selectedViewController?.prefersStatusBarHidden ?? false
}
在 ViewController
class
中添加对 TabBarVC
的引用
var tabBarVC: UIViewController?
在 topLevelControllers()
方法上设置 tabBarVC
变量
let one = self.viewControllerFromStoryBoard(storyboardName: "One",
sceneName: "Initial",
iconName: "",
title: "Tab One") as! ViewController
one.tabBarVC = self
最后,在您的@IBAction 上更新您的状态栏
self.tabBarVC?.setNeedsStatusBarAppearanceUpdate()
您将 TabBarVC 作为 UIViewController
子类而不是 UITabBarController
子类,然后初始化并将 UITabBarController
实例添加到它的视图中,我认为 TabBarVC 应该是 [=12] 的子类=] 并且应该是 window 的 rootViewController。如果将 TabBarVC 更改为 UITabbarViewController
的子类,状态栏工作正常。检查下面的代码
class TabBarVC: UITabBarController, UITabBarControllerDelegate, UINavigationControllerDelegate {
//var mainTabBarController = UITabBarController() //not needed
init() {
super.init(nibName: nil, bundle: nil)
self.delegate = self
self.navigationController?.delegate = self
self.selectedIndex = 0
self.customizableViewControllers = []
self.setViewControllers(self.topLevelControllers(), animated: false)
}
我有一个 UITabBarController()
,我在 AppDelegate
中使用和分配:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
showTabBar()
return true
}
func showTabBar() {
let tabBarVC = TabBarVC()
if let window = self.window {
window.rootViewController = tabBarVC
}
}
我在 info.plist
中有以下键:
在我的 Target
下 General
,我有以下设置:
我在其中一个选项卡中使用以下代码来隐藏状态栏:
class ViewController: UIViewController {
var statusBarShouldBeHidden = false
override func viewDidLoad() {
super.viewDidLoad()
}
override var prefersStatusBarHidden: Bool {
return statusBarShouldBeHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
@IBAction func buttonHideShowStatusBarTapped(_ sender: UIButton) {
statusBarShouldBeHidden = !statusBarShouldBeHidden
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
print("animating")
}
}
}
点击按钮时,"animating" 打印在日志中;但是,状态栏不会隐藏。
我不确定这是否与 UITabBarController()
有关,但上面的代码似乎在没有它的项目中也能正常工作。
如何在使用UITabBarController()
时隐藏iOS10中的状态栏?
您需要在您的根视图控制器中 setNeedsStatusBarAppearanceUpdate()
,即 TabBarVC
。这是解决方案:
将 TabBarVC
中的 prefersStatusBarHidden
覆盖为 selectedViewController
override var prefersStatusBarHidden: Bool {
return mainTabBarController.selectedViewController?.prefersStatusBarHidden ?? false
}
在 ViewController
class
TabBarVC
的引用
var tabBarVC: UIViewController?
在 topLevelControllers()
方法上设置 tabBarVC
变量
let one = self.viewControllerFromStoryBoard(storyboardName: "One",
sceneName: "Initial",
iconName: "",
title: "Tab One") as! ViewController
one.tabBarVC = self
最后,在您的@IBAction 上更新您的状态栏
self.tabBarVC?.setNeedsStatusBarAppearanceUpdate()
您将 TabBarVC 作为 UIViewController
子类而不是 UITabBarController
子类,然后初始化并将 UITabBarController
实例添加到它的视图中,我认为 TabBarVC 应该是 [=12] 的子类=] 并且应该是 window 的 rootViewController。如果将 TabBarVC 更改为 UITabbarViewController
的子类,状态栏工作正常。检查下面的代码
class TabBarVC: UITabBarController, UITabBarControllerDelegate, UINavigationControllerDelegate {
//var mainTabBarController = UITabBarController() //not needed
init() {
super.init(nibName: nil, bundle: nil)
self.delegate = self
self.navigationController?.delegate = self
self.selectedIndex = 0
self.customizableViewControllers = []
self.setViewControllers(self.topLevelControllers(), animated: false)
}