Cambiar el color de fondo de la barra de estado en Swift 3

En XCode 7.3.x cambié el color de fondo para mi StatusBar con:

func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else { return } statusBar.backgroundColor = color } 

Pero parece que esto ya no funciona con Swift 3.0.

Lo intenté con:

 func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = (UIApplication.shared.value(forKey: "statusBarWindow") as AnyObject).value(forKey: "statusBar") as? UIView else { return } statusBar.backgroundColor = color } 

Pero me da:

 this class is not key value coding-compliant for the key statusBar. 

¿Alguna idea de cómo cambiarla con XCode8 / Swift 3.0?

 extension UIApplication { var statusBarView: UIView? { if responds(to: Selector("statusBar")) { return value(forKey: "statusBar") as? UIView } return nil } } UIApplication.shared.statusBarView?.backgroundColor = .red 

Color de fondo de la barra de estado “Cambiar”:

 let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame) let statusBarColor = UIColor(red: 32/255, green: 149/255, blue: 215/255, alpha: 1.0) statusBarView.backgroundColor = statusBarColor view.addSubview(statusBarView) 

Cambiar el color del texto de la barra de estado:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

Actualización: tenga en cuenta que el marco de la barra de estado cambiará cuando se gire la vista. Puede actualizar el marco de subvista creado por:

  • Uso de la máscara de aumento automático: statusBarView.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
  • Observando NSNotification.Name.UIApplicationWillChangeStatusBarOrientation
  • O reemplazando viewWillLayoutSubviews()

Para iOS 11 y Xcode 9, use los siguientes pasos.

  1. crear una extensión a la clase UIApplication :

    extension UIApplication { var statusBarView: UIView? { return value(forKey: "statusBar") as? UIView } }

  2. En su clase o donde quiera cambiar el color de fondo de la barra de estado:

    UIApplication.shared.statusBarView?.backgroundColor = .red

  3. Para contenido ligero o contenido oscuro de la barra de estado, simplemente vaya a Info.plist y agregue la siguiente fila de valor con el valor NO .

Ver la apariencia de la barra de estado basada en el controlador

  1. Ahora solo configure el contenido claro o lo que necesite en la pestaña General de la configuración de su proyecto .

Prueba esto

Vaya a su aplicación info.plist

  1. Establezca la apariencia de la barra de estado basada en el controlador de View en NO
  2. Establecer el estilo de la barra de estado en UIStatusBarStyleLightContent

Luego, vaya a su delegado de la aplicación y pegue el siguiente código donde configure RootViewController de su Windows.

 #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)]; view.backgroundColor=[UIColor blackColor]; [self.window.rootViewController.view addSubview:view]; } 

Para Xcode 9 y iOS 11: el estilo de la barra de estado que trataremos de lograr es una barra de estado con contenido blanco. Vaya al archivo ViewController.swift y agregue las siguientes líneas de código.

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

O desde la opción de configuración del proyecto puede cambiar el estilo de la barra de estado:

enter image description here

A continuación, regrese al Guión gráfico, seleccione Ver controlador y en el menú Editor Seleccione Insertar en controlador de navegación. Seleccione la Barra de navegación y en el Inspector de atributos configure el color del Tinte de barra en rojo. El Storyboard se verá así. enter image description here

Comstackr y ejecutar el proyecto. El contenido de la barra de estado vuelve a estar oscuro, que es el predeterminado. La razón de esto es que iOS solicitó el estilo de la barra de estado del controlador de navegación en lugar del controlador de vista contenido.

enter image description here

Para cambiar el estilo de todos los controles de navegación dentro de la aplicación, cambie el siguiente método en el archivo AppDelegate.swift.

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UINavigationBar.appearance().barStyle = .blackOpaque return true } 

Cree y ejecute el proyecto nuevamente, esta vez el contenido de la barra de estado cambió a blanco.

enter image description here

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any] ?) -> Bool { // Override point for customization after application launch. UINavigationBar.appearance().barStyle = .blackOpaque return true } 

Esto funciona para mí, ya que mi navegación barTintColor era negra y no puede ver la barra de estado.

Cuando se establece encima del código, la barra de estado FinLaLaunch aparece en blanco.

Puede establecer el color de fondo para la barra de estado durante el inicio de la aplicación o durante viewDidLoad de su controlador de vista.

 extension UIApplication { var statusBarView: UIView? { return value(forKey: "statusBar") as? UIView } } // Set upon application launch, if you've application based status bar class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarView?.backgroundColor = UIColor.red return true } } or // Set it from your view controller if you've view controller based statusbar class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() UIApplication.shared.statusBarView?.backgroundColor = UIColor.red } } 

Aquí está el resultado:

enter image description here

Con Swift 3 y 4 puede usar el fragmento de código a continuación. Encuentra la vista desde UIApplication usando valueForKeyPath como establece su color de fondo.

 guard let statusBarView = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return } statusBarView.backgroundColor = UIColor.red 

C objective

 UIView *statusBarView = [UIApplication.sharedApplication valueForKeyPath:@"statusBarWindow.statusBar"]; if (statusBarView != nil) { statusBarView.backgroundColor = [UIColor redColor]; }