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 中有以下键:

在我的 TargetGeneral,我有以下设置:

我在其中一个选项卡中使用以下代码来隐藏状态栏:

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)
    }