【问题标题】:swift ios trying to change color of status bar on certain VC'sswift ios试图改变某些VC的状态栏颜色
【发布时间】: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 的状态栏保持白色?

【问题讨论】:

    标签: ios swift uinavigationcontroller statusbar


    【解决方案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 中已弃用
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2018-08-27
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多