【问题标题】:how to change statusbar color in one view controller using swift?如何使用 swift 在一个视图控制器中更改状态栏颜色?
【发布时间】:2016-05-05 20:50:34
【问题描述】:
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

我用这个来改变所有应用程序中的状态栏。但现在我只需要在一个 View Controller 中将它改回黑色。我该怎么做?

【问题讨论】:

标签: ios xcode swift


【解决方案1】:

在你的 project.plist 中将 View controller-based status bar appearance 设置为 NO

使用viewWillAppear 和viewWillDisappear 来设置和重置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)
}

【讨论】:

  • 嗯,但它应该。发生了什么
  • 这是我的错误。我错过了您的短语“在 project.plist 中将基于视图控制器的状态栏外观设置为 NO”。现在它起作用了。谢谢!
  • 很高兴它成功了,您可能想将您的问题标记为已回答
  • @MarkHim 当我使用它并使用选项卡式导航在两个 VC 之间切换时它不起作用。 stackoverflow.com/questions/38546787/…
  • UIApplication.shared.setStatusBarStyle(initialStatusBarStyle, animated: true) 在 iOS 9 中已弃用。您可能需要更新代码。使用UIApplication.shared.statusBarStyle = initialStatusBarStyle 。
【解决方案2】:

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

这个解决方案有点不同:

  • UIViewController 的子类集中逻辑
  • 没有 viewDidLoad 或 viewDidDisappear 的代码
  • 使用@IBDesignable,因此您可以在情节提要的属性检查器中设置状态栏颜色

第 1 步 - 设置 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
            }
        }
    }
}

第 3 步 - 从 DesignableViewController 继承

从以下位置更改您的 ViewController(s) 的代码:

class ViewController: UIViewController {

收件人:

class ViewController: DesignableViewController {

第 4 步 - 在情节提要上设置您的偏好

选择 Storyboard 上的 ViewControllers 并转到 Attributes Inspector:

第 5 步 - 运行项目并测试

在我的项目中,我设置了一个带有 2 个视图控制器的选项卡栏控制器,并在两者之间来回切换。对我来说似乎工作正常。

【讨论】:

  • 这太棒了!很棒的解决方案。
【解决方案3】:

已解决:
斯威夫特 3.1

只需在 View Controller 中使用此代码:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

【讨论】:

  • 完美,谢谢!自动完成不会显示这一点,因为它是一个 var,但它可以 100% 工作!
【解决方案4】:

斯威夫特 3

将 project.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)
}

【讨论】:

    【解决方案5】:

    Objective-C 回答:

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

    【讨论】:

      【解决方案6】:
       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]
      

      【讨论】:

        【解决方案7】:

        在 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)
        

        【讨论】:

          【解决方案8】:

          您可以使用下面的代码设置状态栏颜色,它对我有用

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

          谢谢 快乐编码:)

          【讨论】:

            【解决方案9】:

            Swift 5、iOS 14、UIKit

            第一步:添加状态栏样式

            第 2 步:更改 Info.Plist

            添加无值的基于视图控制器的状态栏外观键

            第 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()
            }
            

            【讨论】:

              【解决方案10】:

              如果你从一个通用的视图控制器派生了你的视图控制器,那么你可以简单地这样做:

              第 1 步: 将此密钥添加到您应用的 info.plist 文件中。

              第 2 步: override 这个在通用视图控制器中(或 ParentViewController)。

              override var preferredStatusBarStyle: UIStatusBarStyle {
                  if self is YourChildViewController {
                      return .lightContent
                  }
                  return .default
              }
              

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

              【讨论】:

              • return .default 在这种情况下永远不会被执行
              【解决方案11】:

              当您处于不会被调用的导航控制器中时。导航控制器的 preferredStatusBarStyle 将被调用。与您的代码一起尝试:

              extension UINavigationController {
              
              open override var preferredStatusBarStyle: UIStatusBarStyle {
                  return topViewController?.preferredStatusBarStyle ?? .default
                  }
              }
              

              还要这样写:

              override var preferredStatusBarStyle: UIStatusBarStyle {
                  return .lightContent
              }
              

              【讨论】:

                猜你喜欢
                • 2014-02-08
                • 2014-04-14
                • 2015-09-29
                • 2014-11-23
                • 1970-01-01
                • 1970-01-01
                • 2017-08-23
                • 1970-01-01
                • 2018-05-24
                相关资源
                最近更新 更多