无法更改状态栏样式

时间:2018-03-13 13:33:27

标签: ios swift uinavigationcontroller uitabbarcontroller uistatusbar

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

我为实现预期效果所做的工作:

  1. View controller-based status bar appearance中的Info.plist设置为
  2. 可以通过 NAV 显示的每个视图控制器的覆盖preferredStatusBarStyle属性,包括 VC
  3. setNeedsStatusBarUpdate()放入每个视图控制器的viewDidLoad(),可以通过 NAV 显示,包括 VC
  4. 这种方法没有任何结果。

    由于我的initial view controller中的 TAB Main.storyboard,并且所有内容都是通过它显示的,我想也许我可以通过它更改状态栏。所以我在 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()
        }
    }  
    

    然后在每个视图控制器中调用 TAB setStatusBarStyle方法, NAV 包括 VC 在{{ 1}}方法。这也没有结果。有趣的是在 TAB中调用viewWillAppear setStatusBarStyle也没有做任何事情。

    好吧,如果它不是 TAB 阻止我改变风格,那么 NAV 可能是?所以我做了以下扩展:

    viewDidLoad

    然后在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() } } } 方法中由其每个子视图控制器调用 NAV setStatusBarStyle方法。也没有运气。

    很明显,我在这里过度复杂化了。但由于某些原因,提出herehere的答案对我不起作用。我迷失在这里的人。请帮忙。

1 个答案:

答案 0 :(得分:2)

  

现在,我需要应用程序中的每个视图控制器,但VC需要.default   状态栏样式。 VC必须具有lightContent状态栏样式。

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

  1. 为想要拥有灯光状态栏的所有viewControllers创建一个LightBaseViewController: UIViewController或任何基类名称,并将其放在LightBaseViewController的{​​{1}}中:

    viewWillAppear
  2. 然后当然会创建UIApplication.shared.statusBarStyle = .lightContent 并通过将DarkBaseViewController属性恢复为默认值来使状态栏变暗。

    statusBarStyle
  3. 子类或暗基视图控制器。

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

    UIApplication.shared.statusBarStyle = .default
    
  5. 希望这有帮助。