如何更改状态栏样式-iOS 12

时间:2018-09-08 18:15:04

标签: ios swift ios12

我需要根据背景颜色(UINavigationController自动执行的操作)在每个视图控制器上更新状态栏样式。

尝试了stackoverflow中描述的所有选项(View controller-based status bar appearance中的info.plist设置为 YES ),但没有一个对我有用。

我正在使用针对iOS 12的Xcode 10 beta 6和Swift 4.2。

7 个答案:

答案 0 :(得分:23)

Swift 4.2,iOS 12

现在需要在pernmo中将

View controller-based status bar appearance设置为YES,因为UIKit不再希望我们通过info.plist编辑状态栏样式-现在可以查看状态栏样式-基于控制器。

然后,如果要在应用程序级别应用更改,只需在适当的容器视图控制器(最好是根目录)中覆盖UIApplication.shared ...

preferredStatusBarStyle

...这将传播到所有视图控制器。而且,如果您要针对每个View Controller编辑状态栏样式,请针对每个View Controller应用此替代。

如果状态栏样式在运行时发生变化,则需要调用override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } (从容器/根视图控制器或特定视图控制器中的任何位置),否则不需要。

答案 1 :(得分:18)

在{{1}中将View controller-based status bar appearance设置为NO,并在每个视图控制器中覆盖info.plist,如下所示:

preferredStatusBarStyle

然后在视图控制器中调用override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } (例如,在setNeedsStatusBarAppearanceUpdate()中)。

答案 2 :(得分:6)

如果您将View controller-based status bar appearance中的info.plist设置为 YES ,并且您的视图控制器已嵌入UINavigationController中,则导航控制器将负责更新栏样式(通过navigationController.navigationBar.barStyle)和preferredStatusBarStyle属性将被忽略

答案 3 :(得分:3)

我有Xcode 10.2,并且发现与您所做的一样,将info.plist中基于View控制器的状态栏外观设置为“ YES”根本不会更改状态栏样式。

但是,我确实发现,更改info.plist文件中的两个键将完成将状态栏更改为亮或暗的所有工作,而无需任何其他编码。

这是我为自己修复的工作
将鼠标悬停在info.plist文件的第一行“信息属性列表”上时,将出现一个小的圆形“ +”按钮。单击此按钮并滚动浏览各项,直到找到以下键。

基于控制器的状态栏外观 [将此值设置为
状态栏样式 [将此值设置为 UIStatusBarStyleLightContent

注意: 在值列表中找不到UIStatusBarStyleLightContent作为可选项,必须在值框中键入该值。

info.plist

希望这对您或其他寻求此问题答案的人有帮助。

答案 4 :(得分:1)

最后,什么对我有用:

添加到Info.plist:

View controller-based status bar appearance : YES

对于每个ViewController,分别添加到viewDidLoad()和viewDidAppear():

self.setNeedsStatusBarAppearanceUpdate()

a)对于深色状态栏,添加到ViewController:

    override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default
}

b)对于白色状态栏,添加到ViewController:

    override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

答案 5 :(得分:1)

如果您被包装在导航控制器中,则将需要以下内容:

final class LightNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

答案 6 :(得分:-1)

override func viewDidLoad(){
    super.viewDidLoad()

    navigationController?.navigationBar.barStyle = .default
}

override var prefersStatusBarHidden: Bool {
    return true
}

我也在同一屏幕上应用了滚动视图,通过此代码,它可以解决状态栏问题。