在iOS8中使用Swift更改特定ViewControllers的状态栏颜色

Anu*_*nuj 174 statusbar uiviewcontroller swift xcode6 ios8

override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}
Run Code Online (Sandbox Code Playgroud)

在任何ViewController中使用上面的代码将statusBar颜色设置为White为特定的viewcontroller 在iOS8中不起作用.有什么建议?使用UIApplication.sharedApplication方法,在整个应用程序的Info.plist中所需的更改之后,颜色会发生变化.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Run Code Online (Sandbox Code Playgroud)

如何更改某些必需和特定ViewControllers的状态栏颜色?

Anu*_*nuj 340

在阅读了所有建议并尝试了一些事情之后,我可以使用以下步骤将其用于特定的viewcontrollers:

第一步:

打开info.plist并将名为" View controller-based status bar appearance " 的新密钥插入NO

第二步(只是一个解释,不需要实现这个):

通常我们将以下代码放在AppDelegate的应用程序(_:didFinishLaunchingWithOptions :)方法中,

斯威夫特2

UIApplication.sharedApplication().statusBarStyle = .LightContent
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

UIApplication.shared.statusBarStyle = .lightContent
Run Code Online (Sandbox Code Playgroud)

但这会影响statusBarStyle所有ViewControllers.

那么,如何使这个特定的ViewControllers工作 - 最后一步:

打开要更改的viewcontroller文件statusBarStyle并将以下代码放入viewWillAppear(),

斯威夫特2

UIApplication.sharedApplication().statusBarStyle = .LightContent
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

UIApplication.shared.statusBarStyle = .lightContent
Run Code Online (Sandbox Code Playgroud)

此外,viewWillDisappear()为该特定viewController 实现该方法并放入以下代码行,

斯威夫特2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}
Run Code Online (Sandbox Code Playgroud)

此步骤将首先更改statusBarStyle特定视图控制器,然后将其更改回default特定视图控制器消失时.未实现viewWillDisappear()statusBarStyle永久更改为新定义的值UIStatusBarStyle.LightContent

  • 如果你使用`viewWillDisappear()`改回`UIStatusBarStyle.Default`,你应该使用`viewWillAppear()`来初始化它,而不是`viewDidLoad()`....否则如果你回到那个视图没有它必须重新加载,你将看不到你期望的`StatusBarStyle`. (12认同)
  • **对于Swift 3:**`UIApplication.shared.statusBarStyle = .lightContent` (7认同)
  • 请注意,如果在info.plist文件中设置"状态栏最初隐藏= YES",则"查看基于控制器的状态栏外观=否"将导致状态栏变为隐藏状态. (4认同)
  • 目前还不清楚如何更改状态栏的颜色 (2认同)
  • 伙计们,从iOS 9开始弃用 (2认同)

Ben*_*erd 86

(截至2018年11月14日)

Swift 4,Swift 4.2

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
Run Code Online (Sandbox Code Playgroud)

  • 如果要复制并粘贴此代码,请务必调用`super.viewWillAppear` (6认同)
  • 使用`UIApplication.shared.statusBarStyle = .lightContent`导致此编译器警告:在iOS 9.0中不推荐使用'statusBarStyle'的Setter:使用 - [UIViewController preferredStatusBarStyle] (3认同)
  • 如果您的视图控制器嵌入到根导航控制器中,则不起作用。如果控制器A是白色的,然后推到控制器B,这将不起作用,它将保持白色。 (3认同)
  • 如果您以模态方式包装在导航控制器中的视图控制器,则需要为导航控制器设置“modalPresentationCapturesStatusBarAppearance = true” (3认同)
  • 在应用程序的Info.plist中,将“基于视图控制器的状态栏外观”设置为YES。 (2认同)

chr*_*s_s 26

我按照本教程,它对我有用.但是,我不确定是否有任何警告.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • 打开info.plist并设置 UIViewControllerBasedStatusBarAppearancefalse.
  • AppDelegate.swift包含的第一个函数中,didFinishLaunchingWithOptions设置所需的颜色.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3更新*

    UIApplication.shared.statusBarStyle = .lightContent

  • 具体如何对每个视图控制器 (9认同)
  • 确切地说,这是针对完整的应用程序,这不是问题. (3认同)
  • 我正在使用iOS 8 Swift和xCode 6.1.1,只是按照这两个步骤不起作用.您还需要将"UIApplication.sharedApplication().statusBarHidden = false"添加到AppDelegate.swift didFinishLauchingWithOptions (2认同)

小智 24

带NavigationController的Swift 4.2解决方案

第一步:

打开info.plist并插入一个名为" 查看基于控制器的状态栏外观 " 的新键,或者UIViewControllerBasedStatusBarAppearance输入YES以让每个VC使用自己的状态属性.

第二步

在每个VC中,覆盖preferredStatusBarStyle属性,如下所示:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}
Run Code Online (Sandbox Code Playgroud)

最后一步

覆盖自定义NavigationController类中的preferredStatusBarStyle属性:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}
Run Code Online (Sandbox Code Playgroud)

  • 这只是使用导航控制器和您自己的控制器实现预期结果的方法。你也可以像我为我的项目所做的那样对prefersStatusBarHidden这样做:) (2认同)

Joh*_*rry 20

这里有十亿个答案所以我想为什么不以扩展的形式添加另一个(在@Cœur的帮助下)

斯威夫特3

延期:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

执行:

UIApplication.statusBarBackgroundColor = .blue
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这种方法可能被视为访问私有 API,并且可能意味着您的应用程序将被 Apple 拒绝。 (2认同)

Nik*_*wal 17

在Info.plist中,您需要将基于View控制器的状态栏外观定义为任何值.

如果将其定义为YES,则应在每个视图控制器中覆盖preferredStatusBarStyle函数.

如果您将其定义为NO,则可以使用AppDelegate设置样式

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Run Code Online (Sandbox Code Playgroud)

  • 在iOS 9.0中不推荐使用`setStatusBarStyle` (7认同)

A.G*_*A.G 14

override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 12

SWIFT 2

通过在viewWillAppear中添加以下内容,我能够成功更改状态栏背景的外观:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 12

斯威夫特3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 
Run Code Online (Sandbox Code Playgroud)

这是为特定视图控制器设置状态栏背景颜色的解决方案.

  • UIView总是在Swift中响应backgroundColor. (2认同)

Gia*_*ang 9

对于斯威夫特3

的.plist

View controller-based status bar appearance = NO
Run Code Online (Sandbox Code Playgroud)

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了所有的解决方案......这只对我有用!!我不知道为什么 :D (2认同)

cod*_*ter 8

preferredStatusBarStyle如你所述实现并调用 self.setNeedsStatusBarAppearanceUpdate(),ViewDidLoad并在Info.plist中设置UIViewControllerBasedStatusBarAppearanceYES(YES默认情况下)

目前尚不清楚为什么它不工作.我需要检查代码.另外一个建议是使用工作代码viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent并在查看get消失时将其更改为默认值viewWillDisappear.


wen*_*ong 8

在我的情况下,我使用故事板来组织我的视图控制器.我想更改所有状态栏样式.

你可以在下面看到.

在此输入图像描述

StarsView Controller是一个CPBaseNavigationController,CPBaseNavigationController是它的子类UINavigationController.

我尝试做下一个setps:

  1. AppDelegate.swiftfunc中didFinishLaunchingWithOptions,添加

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    
    Run Code Online (Sandbox Code Playgroud)

    但没有效果.

  2. 在StoryBoard中,找到Base Tab BarController(上图中的图片).选择Attributes Inspector,将Sattus Bar属性更改为Light Content.so bad,no effect.

在此输入图像描述

  1. 最后我明白了.在我的自定义导航控制器中CPBaseNavigationController,添加funcpreferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }
    
    Run Code Online (Sandbox Code Playgroud)

    它运作良好!

此外,statusBarStyle在9.0中弃用,您可以使用-[UIViewController preferredStatusBarStyle].


use*_*632 8

(截至 2020 年 6 月 10 日)

Swift 5无需编辑.Plist文件

如果您正在使用Storyboard,请转到NavigationController,选择navigationBar,单击Attributes Inspector,然后更改style。如果你需要light content白色状态栏)设置它除了default可以说设置样式black如果你想要dark content黑色状态栏)设置它default

默认 ( UIBarStyleDefault) 导致前景UIStatusBarStyleDefault状态栏变暗。并且UIBarStyleBlack会给出一个UIStatusBarStyleLightContent状态栏。

以编程方式

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar
Run Code Online (Sandbox Code Playgroud)

没有导航栏编辑.Plist

UIViewControllerBasedStatusBarAppearance/添加View controller-based status bar appearance到您的info.plist,并设置值为true.

OverridepreferredStatusBarStyle您的控制器中的属性

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
Run Code Online (Sandbox Code Playgroud)


Jio*_*Jio 7

适用于导航应用

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
Run Code Online (Sandbox Code Playgroud)


小智 7

在Swift 3.0 Xcode 8中,一切都变得容易多了

之后使用App Delegate文件中的代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Run Code Online (Sandbox Code Playgroud)

插入此:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Run Code Online (Sandbox Code Playgroud)


小智 7

斯威夫特3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

Swift 4对于没有使用navigationViewController嵌入的特定ViewController,只需将其添加到ViewController文件即可.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我在这方面遇到了一些麻烦。对于全局更改视图中的状态栏颜色确实出现然后将其更改回视图确实像接受的答案一样消失了,我真的感觉不太好。信不信由你,你可以通过覆盖preferredStatusBarStyle你想要的视图控制器来让它工作。很长一段时间后,这就是我为使其工作所做的工作:

  1. 将视图中基于控制器的状态栏外观更改info.plist为 YES。
  2. 现在任何全屏视图控制器都可以通过覆盖preferredStatusBarStyle.
  3. 我指定全屏,因为这不适用于(非全屏)模态视图控制器,而不是没有设置modal?Presentation?Captures?Status?Bar?Appearance为 Yes。
  4. 此外,如果您有嵌入式视图控制器,例如在导航控制器中,它会询问最顶层的视图控制器状态栏样式。覆盖child?View?Controller?For?Status?Bar?Style和传递嵌入式视图控制器应该可以工作,但对我来说却没有。所以我只是将嵌入式视图控制器的首选状态栏作为首选状态栏样式返回。像这样的东西:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
    
    Run Code Online (Sandbox Code Playgroud)


aze*_*emi 5

完成这项工作的另一种非常简单的方法是创建UINavigationController类的扩展。

由于覆盖的preferredStatusBarStyle:方法不会工作,除非我们这样做了的UINavigationController类的内部。

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
Run Code Online (Sandbox Code Playgroud)


Tun*_*Fam 5

状态栏的自定义颜色(iOS11+、Swift4+)

如果您正在寻找如何将状态栏更改为自定义颜色的解决方案,那么这是可行的解决方案。

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
Run Code Online (Sandbox Code Playgroud)


小智 5

在 Swift 5 或 xcode 11 及更高版本中,在 info.plist 中设置(基于视图控制器的状态栏外观)键为 NO 然后转到项目目标并选择常规,将状态栏样式设置为深色或浅色