swift ios试图改变某些VC的状态栏颜色

Posted

技术标签:

【中文标题】swift ios试图改变某些VC的状态栏颜色【英文标题】:swift ios trying to change color of status bar on certain VC's 【发布时间】:2016-11-27 13:23:42 【问题描述】:

在我的应用程序中,我有 4 个 ViewController,其中两个我将状态栏从白色更改为黑色,如下所示:

override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)

        UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
    

    override func viewWillDisappear(animated: Bool) 
        super.viewWillDisappear(animated)

        UIApplication.sharedApplication().statusBarStyle = .LightContent
    

问题是,如果我在两个都有状态栏上方代码的 ViewController 之间切换,首先会变成黑色,这是正确的,但是当进入另一个 ViewController 时,它又会变成白色。

如何让某些 ViewController 的状态栏保持白色?

【问题讨论】:

【参考方案1】:

尝试在您的 VC 中添加以下方法。使用 .default 或 .lightContent 更改状态栏颜色。我使用 Xcode 8 和 swift 3 进行了测试:

override func preferredStatusBarStyle() -> UIStatusBarStyle 
    return UIStatusBarStyle.default;

我使用 Xcode 7.3.1 和 swift 2.3 创建了一个新的选项卡式应用程序。我有两个选项卡,其中包含与 FirstViewController 和 SecondViewController 关联的类。在 FirstViewController 我添加了以下方法:

override func preferredStatusBarStyle() -> UIStatusBarStyle 
    return UIStatusBarStyle.Default;

并且在 SecondViewController 中,我将背景更改为黑色,并添加了以下方法:

override func preferredStatusBarStyle() -> UIStatusBarStyle 
    return UIStatusBarStyle.LightContent;

最后,我在 FirstViewController 中添加了两个按钮。一个按钮以模态方式呈现控制器,另一个按钮通过按下呈现。当我以模态方式呈现视图时,“preferredStatusBarStyle”工作,但是当我通过推送呈现时,我需要添加以下代码行:

self.navigationController?.navigationBar.barStyle = .Black

【讨论】:

这还需要在项目的info.plist 文件中添加View controller-based status bar appearance 键设置为on/YES,并且可能需要在应用程序的根视图控制器子类上自定义实现- (UIViewController *)childViewControllerForStatusBarStyle;,具体取决于架构您的视图层次结构 这行不通,因为@markedwardmurray 所说的。但是我不能在每个 VC 中都使用override func viewWillAppear(animated: Bool) super.viewWillAppear(animated) UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default 吗? 你会想,但是在视图控制器之间改变状态栏的全局状态有很多特性。使用基于视图控制器的状态栏外观更可靠。在 ios 10 中,要在 UIViewController 上覆盖的 getter 实际上会变成完整的属性。全局外观方法是从应用程序被期望具有单一配色方案(浅色或深色)的日子开始的。应用启动后用频率切换效果不好【参考方案2】:

如果你真的不想重写preferredStatusBarStyle的委托方法,你仍然可以使用:

UIApplication.sharedApplication().statusBarStyle = .LightContent

通过删除:

override func viewWillDisappear(animated: Bool) 
    super.viewWillDisappear(animated)

    UIApplication.sharedApplication().statusBarStyle = .LightContent

让状态栏由 viewWillAppear 中发生的事情来设置。显然这更容易出错,但如果你的导航是相对线性的,那么这将是最简单的解决方案

【讨论】:

在 iOS 9.0 中已弃用

以上是关于swift ios试图改变某些VC的状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

VC/MFC怎么改变状态栏字体颜色和大小

swift iOS中的UINavigation状态栏颜色变化[重复]

iOS Swift TabBar状态栏文字颜色毛刺半白半黑

Swift-修改状态栏颜色

状态栏样式不会因单个视图而改变 - Swift 2/iOS9

Swift:更改 iOS 13 的状态栏颜色