无法更改状态栏样式

Unable to change status bar style

我有一个 UIViewController VC,它嵌入在 UINavigationController NAV 中。 NavigationController 嵌入在 UITabBarController TAB 中。现在,我需要我的应用程序中的每个视图控制器,但 VC 具有 .default 状态栏样式。 VC 必须具有 lightContent 状态栏样式。

为了达到预期效果我做了什么:

  1. Info.plist 中的 View controller-based status bar appearance 设置为 YES.
  2. 覆盖 preferredStatusBarStyle 属性 可以由 NAV 显示的每个视图控制器,包括 VC.
  3. setNeedsStatusBarUpdate()放入NAV可以显示的每个视图控制器的viewDidLoad(),包括VC.

这样的做法一无所获。

由于 TAB 在我的 Main.storyboardinitial view controller 并且所有内容基本上都通过它显示,我想也许我可以通过它更改状态栏。所以我在TAB描述里面写了如下内容:

//  MARK: Status bar
///
private var requiredStatusBarStyle: UIStatusBarStyle = .default
//
override var preferredStatusBarStyle: UIStatusBarStyle { get { return self.requiredStatusBarStyle } }
///
func setStatusBarStyle(_ style: UIStatusBarStyle)
{
    requiredStatusBarStyle = style
    DispatchQueue.main.async
    {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}  

然后通过NAV可以显示的每个视图控制器调用TABsetStatusBarStyle方法,包括VCviewWillAppear 方法中。这也没有结果。有趣的是在 TAB 的 viewDidLoad 中调用 setStatusBarStyle 也什么都不做。

嗯,如果不是 TAB 阻止我改变风格,也许 NAV 是?所以我做了以下扩展:

struct UINavigationControllerExtensionKeys
{
    static var UIStatusBarStyleKey: UInt8 = 0
}

extension UINavigationController
{
    private var requiredStatusBarStyle: UIStatusBarStyle
    {
        get
        {
            guard let style = objc_getAssociatedObject(self, &UINavigationControllerExtensionKeys.UIStatusBarStyleKey) as? UIStatusBarStyle else
            {
                return .default
            }
            return style
        }
        set (style)
        {
            objc_setAssociatedObject(self, &UINavigationControllerExtensionKeys.UIStatusBarStyleKey, style, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    open override var preferredStatusBarStyle: UIStatusBarStyle { get { return self.requiredStatusBarStyle } }

    func setStatusBarStyle(_ style: UIStatusBarStyle)
    {
        requiredStatusBarStyle = style
        DispatchQueue.main.async
        {
            self.setNeedsStatusBarAppearanceUpdate()
        }        
    }
}

然后在 viewWillAppear 方法中由它的每个子视图控制器调用 NAVsetStatusBarStyle 方法。也不走运。

很明显我把这里的事情复杂化了。但出于某种原因,答案 poroposed and here 对我不起作用。我在这里迷路了。请帮忙。

Now, I need every view controller in my app but VC to have .default status bar style. VC has to have lightContent status bar style.

对我来说,你只是让自己对你的方法感到头疼。这是我的看法,它会容易得多。

  1. 为所有想要拥有灯光状态栏的视图控制器创建一个 LightBaseViewController: UIViewController 或任何你想要的基础 class 名称,并将其放入 LightBaseViewControllerviewWillAppear:

    UIApplication.shared.statusBarStyle = .lightContent
    
  2. 然后当然做一个DarkBaseViewController并通过使statusBarStyle属性回到默认状态使状态栏变暗。

    UIApplication.shared.statusBarStyle = .default
    
  3. Subclass 深色或浅色基础视图控制器。

  4. 最后,在您的 info.plist 中将此 属性 设置为 NO:

    View controller-based status bar appearance
    

希望这对您有所帮助。