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

Posted

技术标签:

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

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

【问题讨论】:

Changing the Status Bar Color for specific ViewControllers using Swift in ios8的可能重复 【参考方案1】:

在你的 project.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)

【讨论】:

嗯,但它应该。发生了什么 这是我的错误。我错过了您的短语“在 project.plist 中将基于视图控制器的状态栏外观设置为 NO”。现在它起作用了。谢谢! 很高兴它成功了,您可能想将您的问题标记为已回答 @MarkHim 当我使用它并使用选项卡式导航在两个 VC 之间切换时它不起作用。 ***.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 5iOS 14UIKit

第一步:添加状态栏样式

第 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

【讨论】:

以上是关于如何使用 swift 在一个视图控制器中更改状态栏颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改模态视图 iOS 6 上的状态栏

Swift 4 - 特定视图控制器状态栏样式不变

如何在swift中逐渐隐藏状态栏

在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)

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

swift xcode更改状态栏(背景颜色)