UIStatusBarStyle不变

时间:2018-08-11 12:02:49

标签: swift uistatusbar

我正在开发一个快速的应用程序,我想根据该应用程序的主题(有2个选项-浅色和深色主题)更改UIStatusBarStyle。我在View controller-based status bar appearance中将NO设置为info.plist,在UIViewController中,我尝试根据当前主题进行设置,如下所示:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return Theme.current.statusBarStyle
}


protocol ThemeProtocol { 
    // Status Bar
    var statusBarStyle: UIStatusBarStyle { get } 
}

class Theme {
    static var current: ThemeProtocol = LightTheme()
}

class LightTheme: ThemeProtocol {
    // Status Bar 
    var statusBarStyle: UIStatusBarStyle = .default

}

class DarkTheme: ThemeProtocol {
    // Status Bar 
    var statusBarStyle: UIStatusBarStyle = .lightContent

}

真的没有结果。我尝试通过仅返回以下内容来测试它:return .lightContent,但这也没有改变状态栏。

我在做什么错?

更新:

好的,这就是我正在尝试做的,但是它不起作用。

    fileprivate func applyTheme() {

    statusBarStyle = UserDefaults.standard.bool(forKey: SelectedThemeKey) ? .default : .lightContent
    self.setNeedsStatusBarAppearanceUpdate()

}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return statusBarStyle
}

它不起作用。尽管更改了主题,状态栏始终保留默认样式。 applyTheme()viewDidLoad()viewWillAppear()

中被调用

3 个答案:

答案 0 :(得分:2)

您需要在进行任何更改后调用此方法

setNeedsStatusBarAppearanceUpdate()

//

class ViewController: UIViewController {

    var current = UIStatusBarStyle.default

    @IBAction func changeClicked(_ sender: Any) {
        current = current == .default ? .lightContent : .default
        self.setNeedsStatusBarAppearanceUpdate()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    override  var preferredStatusBarStyle: UIStatusBarStyle {
        return current
    }

}

enter image description here

答案 1 :(得分:2)

首先,您的代码没有意义。你说

  

我已在info.plist和我尝试设置的UIViewController中将基于View控制器的状态栏外观设置为NO。

因此,一方面,您告诉运行时,请监听我的视图控制器。然后,当运行库不监听您的视图控制器时,您就会抱怨!

第二,请记住,除非它是顶级视图控制器(或顶级视图控制器有意遵从它),否则视图控制器在状态栏外观中没有发言权。例如,如果您的视图控制器位于导航控制器内部,则其this._auth.userState$ .mergeMap(user => this._userMetaData.getData(user.uid)) .subscribe(data => { console.log(data); }); 完全不相关。

答案 2 :(得分:0)

第一

如果您尝试将StatusBarStyle更改为UIApplication.shared.statusBarStyle = .default,则应设置 View controller-based status bar appearance成为NO

以这种方式,您需要在任何地方自己控制UIApplication.shared.statusBarStyle;例如viewWillAppear / viewWillDisappear

但是在iOS 9之后不推荐使用此方法。

现在,我建议您学习新方法:

请设置View controller-based status bar appearanceYES,并且

覆盖UIViewController的{​​{1}}来处理它。

preferredStatusBarStyle

但是它仍然不起作用,为什么?

在您的情况下,我认为override var preferredStatusBarStyle: UIStatusBarStyle { return .default } UIViewController的{​​{1}}中的一个。

如果您使用viewControllers,则应覆盖UINavigationController中的UINavigationController

也许您会说我需要使用差异视图控制器设置不同的状态栏样式,没关系。

像这样在preferredStatusBarStyle中覆盖UINavigationController

childForStatusBarStyle

然后在您要更改的UINavigationController中覆盖override var childForStatusBarStyle: UIViewController? { return topViewController }

您也可以像这样通过preferredStatusBarStyle做到

UIViewController