如何使用Swift在一个视图控制器中更改状态栏颜色?

11
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

我用这个方法将所有应用程序中的状态栏更改为浅色。但现在我只需要在一个视图控制器中将其更改回黑色。我该如何做到?


10个回答

13

将项目的.plist文件中的View controller-based status bar appearance设置为NO

使用viewWillAppearviewWillDisappear来设置和重置statusBarStyle,同时保留一个先前statusBarStyle的属性,像这样

let initialStatusBarStyle : UIStatusBarStyle

func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    initialStatusBarStyle = UIApplication.sharedApplication().statusBarStyle
    UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: animated)
}

func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarStyle(initialStatusBarStyle, animated: animated)
}

嗯,但它应该可以。发生了什么? - MarkHim
1
这是我的错误。我错过了你的那句话“将项目中的View controller-based status bar appearance设置为NO”。现在它可以工作了。谢谢! - Ivan A
很高兴它能够解决问题,你可能会想要将你的问题标记为已回答。 - MarkHim
@MarkHim 当我使用这个并在标签式导航中切换两个VC时,它不起作用。http://stackoverflow.com/questions/38546787/swift-ios-trying-to-change-color-of-status-bar-on-certain-vcs - user2722667
UIApplication.shared.setStatusBarStyle(initialStatusBarStyle, animated: true) 在iOS 9中已经被弃用。您可能需要更新您的代码。请使用 UIApplication.shared.statusBarStyle = initialStatusBarStyle - Cesare

13

Xcode 8.1, Swift 3带有@IBDesignable的解决方案

这个解决方案有点不一样:

  • UIViewController的子类用于集中逻辑
  • 没有为viewDidLoad或viewDidDisappear编写代码
  • 使用@IBDesignable,因此您可以在Storyboard的Attributes Inspector中设置状态栏颜色

步骤1 - 设置Info.plist文件

Info.plist

步骤2 - 子类化UIViewController

import UIKit

@IBDesignable
class DesignableViewController: UIViewController {

    @IBInspectable var LightStatusBar: Bool = false

    override var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            if LightStatusBar {
                return UIStatusBarStyle.lightContent
            } else {
                return UIStatusBarStyle.default
            }
        }
    }
}

第三步 - 继承自DesignableViewController

将您的ViewController(们)的代码从以下内容更改为:

class ViewController: UIViewController {

收件人:

class ViewController: DesignableViewController {

第四步 - 在Storyboard上设置您的偏好

选择Storyboard上的ViewControllers并进入Attribute Inspector: 属性检查器

第五步 - 运行项目并测试

在我的项目中,我使用Tab Bar控制器设置了两个View Controllers,并在它们之间切换。对我来说似乎工作得很好。 浅色状态栏 深色状态栏


这太棒了!绝妙的解决方案。 - ZardozSpeaks

8

已解决:
Swift 3.1

只需在视图控制器中使用以下代码:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

1
太好了,谢谢!自动完成没有显示它,因为它是一个变量,但它百分之百有效! - Lucas P.

2

Swift 3

在您的项目.plist中将“基于视图控制器的状态栏外观”设置为NO。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.setStatusBarStyle(.default, animated: animated)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.shared.setStatusBarStyle(.lightContent, animated: animated)
}

1
一个Objective-C的答案:
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}

0
 let color = UIColor(red:0.00, green:0.60, blue:0.48,alpha:1.0)
        UINavigationBar.appearance().tintColor = UIColor.blue
        UINavigationBar.appearance().barTintColor = color

或者

self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

0

Swift 5iOS 14UIKit

步骤1:添加状态栏样式

enter image description here

步骤2:更改Info.Plist中的设置

添加“View controller-based status bar appearance”键,其值为NO

enter image description here

步骤3:在您的基本视图控制器中添加此扩展

extension UIViewController
{
func setStatusBarColor(){
    if #available(iOS 13, *)
    {
        let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        let statusBarFrame = window?.windowScene?.statusBarManager?.statusBarFrame
        let statusBar = UIView(frame: (statusBarFrame)!)
        statusBar.backgroundColor = .orange
        window?.addSubview(statusBar)
    } else {
        // ADD THE STATUS BAR AND SET A CUSTOM COLOR
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
            statusBar.backgroundColor = .orange
        }
        UIApplication.shared.statusBarStyle = .lightContent
    }
}

}

步骤4:在您的视图控制器中使用此扩展

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setStatusBarColor()
}

0
在我的基于导航栏的项目中,swit4 运行得很好。
   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

0

您可以使用以下代码设置状态栏颜色,这对我有效:

self.navigationController?.SetStatusBar(StatusBarbackgroundColor: ThemeBackColor, StatusTextColor: .black)

谢谢 愉快的编程 :)


-1
如果您的视图控制器派生自通用视图控制器,那么可以简单地按照以下步骤进行操作: 第1步:将此密钥添加到应用程序的 info.plist 文件中。

enter image description here

第二步: 在通用视图控制器(或ParentViewController)中override此方法。
override var preferredStatusBarStyle: UIStatusBarStyle {
    if self is YourChildViewController {
        return .lightContent
    }
    return .default
}

就这样!没有更多花哨的东西了。


在这种情况下,return .default 将永远不会被执行。 - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接