preferredStatusBarStyle 在 iOS 13 和其他中未被调用

preferredStatusBarStyle not getting called in iOS 13 and other

我的应用程序中有多个 UITabBar,有些 ViewController 有白色状态栏,有些 ViewController 有黑色状态栏。

我的info.plist

View controller-based status bar appearanceYES

我的 Viewcontroller 有以下代码。

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default //or return . lightContent
}

preferredStatusBarStyle 从未接到电话。

我也在我的控制器中写了下面一行 viewDidLoad 但上面仍然没有被调用。

self.setNeedsStatusBarAppearanceUpdate()

我也将 controller-based status bar appearance 更改为 YES && NO 多次检查,但对我没有任何帮助。

我也尝试了以下解决方案和其他 Whosebug 答案,但没有任何帮助。

编辑

我试过下面的代码,returns 我是 topViewController,它会调用 ViewController

preferredStatusBarStyle
extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

所以一旦 topViewController 找到它就会调用那个特定 ViewControllerpreferredStatusBarStyle

但问题是它没有在 UITabBarController -> UINavigationController -> UIViewController.

中被调用

要求

我有 2 个不同的 TabBarController

第一个 TabBarController statusBarStyle 是 .lightContent

第二个 TabBarController statusBarStyle 在不同的控制器中是 .lightContent.default

当我切换到第二个 TabBarController 时,它将调用第二个 TabBarControllerpreferredStatusBarStyle 并且所有 ViewController statusBarStyle 变为 .default 但我的一些控制器 statusBarStyle 想要.ligthContent

我怎样才能做到这一点?

任何帮助将不胜感激。

谢谢

请参考这个

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621453-modalpresentationcapturesstatusb

override var modalPresentationCapturesStatusBarAppearance: Bool {
        set {}
        get{

            return true
        }
    }

the following may be of assistance to you;

For developer guidance, see the UIStatusBarStyle constant in UIApplicenter code hereation and the preferredStatusBarStyle property in UIViewController.

我找到了解决方案。

输入下面的代码找到topViewController

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

所以一旦它找到 topViewController,下面的代码将在您当前的 ViewController 中调用,您可以根据要求设置 statusBarStyle

override var preferredStatusBarStyle: UIStatusBarStyle { }

在我的例子中,我有 2 个 TabBar

第一个 TabBar 个控制器属于 .lightContent,第二个 TabBar 个控制器属于 .default,因此创建 2 个 UITabBarController。第一个用于 .lightContent,第二个用于 .default,然后将 preferredStatusBarStyle 放入其中。

所以当你在 UITabBarController 子控制器时,你的 UITabBarController preferredStatusBarStyle 会被调用并且子控制器 statusBarStyle 会根据你的设置样式进行设置。

这与iOS13无关。你只是规则错误。

在导航控制器的情况下,状态栏的颜色不是由视图控制器的 preferredStatusBarStyle 决定的。

居然是由导航栏的barStyle决定的。要获取灯光状态栏文本,请说(在您的视图控制器中):

self.navigationController?.navigationBar.barStyle = .black