¿Cómo oculto la barra de estado en una aplicación Swift para iOS?

201

Me gustaría eliminar la barra de estado en la parte superior de la pantalla.

Esto no funciona:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

También he intentado:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}
Arrendajo
fuente
Posible duplicado de ¿Cómo ocultar una barra de estado en iOS?
Jake Chasan

Respuestas:

450

Realmente debería implementar prefersStatusBarHidden en su (s) controlador (es) de vista:

Swift 3 y posterior

override var prefersStatusBarHidden: Bool {
    return true
}
Drewag
fuente
44
Creo que la intención de Jay es ocultar la barra de estado para la aplicación completa. Es por eso que habría escrito la funcionalidad de ocultar en la aplicación didFinishLaunchingWithOptions. ¿Cómo ocultar la barra de estado para la aplicación completa?
Satyam
@Satyam tiene un buen punto, sería bueno eliminar esto en toda la aplicación. ¿Existe un enfoque para implementar esto a través de la herencia? ¿O a través de la extensión de protocolo?
Dan Beaulieu
3
@DanBeaulieu Creo que a través de la herencia sería una gran solución. Cree una subclase UIViewController donde la barra oculta se establezca en verdadero y luego haga que todas sus subclases hereden de esa. Otro enfoque podría estar usando Swizzling
crisisGriega
1
El código Swift 3 no funcionó, consulte: stackoverflow.com/a/38902285/129202
Jonny
1
En este método hay un error: cuando desea realizar una segue, su vista principal del controlador de vista actual se cae aproximadamente 20 px
iman kazemayni
99
  1. Ir al archivo Info.plist
  2. Desplácese sobre una de esas líneas y aparecerá un botón (+) y (-).
  3. Haga clic en el botón más para agregar una nueva clave Escriba al inicio con V mayúscula y automáticamente la primera opción será Ver la apariencia de la barra de estado basada en el controlador.
  4. Agregue eso como la CLAVE.
  5. Establezca el VALOR en "NO"
  6. Ve a tu AppDelegate.swift
  7. Agregue el código, dentro del método

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }

¡HECHO! Ejecute su aplicación y no más barra de estado!

nycdanie
fuente
1
Al principio pensé que esta solución funcionaba bien, pero luego noté que causa un error que necesitaba depurar con CG_CONTEXT_SHOW_BACKTRACE. Retrocedió a la adición de "Ver la apariencia de la barra de estado basada en el controlador"
Sean
Me funcionó bien en IOS 9 2.2
uplearnedu.com
1
Trabajó para el simulador de iOS 10.1. Gracias, @nycdanie.
Jerome
77
Además de establecer "Ver la apariencia de la barra de estado basada en el controlador" en NO, también agregue "La barra de estado está inicialmente oculta", establezca en "SÍ". Entonces no necesita agregar código en el controlador de vista y la barra de estado estará oculta en toda la aplicación. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF
1
@tylerSF funciona muy bien! Deberías agregar esto como respuesta :)
Pétur Ingi Egilsson
72

Swift 3

En Info.plistconjunto View controller-based status bar appearanceaNO

Y llama UIApplication.shared.isStatusBarHidden = true

Joseph Mark
fuente
1
Si se establece en sí, esta es la única forma en que funcionará.
farzadshbfn
@farzadshbfn eso no está bien. Como mencioné y probé por mí, funciona con NO booleano.
Codetard
43

Si desea ocultar y recuperar la barra de estado al tocar el botón , al momento de presentar y cerrar el menú deslizable , ventanas emergentes , etc., puede usar este método: -

Para ocultar la barra de estado: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Para recuperar la barra de estado: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Vincent Joy
fuente
Esto es más un truco. No me gustaría entrometerme con la ventana como esta ... especialmente si ya existe una solución. Me gustaría animar a los desarrolladores para anular la prefersStatusBarHiddenpropiedad como lo que ya se ha mencionado.
Stephen Paul
2
esto se puede usar si queremos ocultar y recuperar la barra de estado momentáneamente ... en mi aplicación, cuando el menú del control deslizante viene del lado izquierdo, tengo que ocultar la barra de estado. y cuando el menú desaparece, tenemos que traer de vuelta la barra de estado, como en la aplicación de iOS de gmail ... así que en ese tipo de escenarios, podemos usar esto.
Vincent Joy
3
ES un corte, y yo no meterse con él, pero hace el trabajo por el momento. Algo así como todos ustedes dicen. El problema prefersStatusBarHiddenes que las vistas vinculadas a la barra de estado usando restricciones, y también las barras de navegación, se moverán de una manera incorrecta si activa / desactiva la barra de estado usando prefersStatusBarHidden . Por el momento, solo esta respuesta parece funcionar alrededor de eso.
Jonny
Totalmente de acuerdo con @Jonny, tampoco me gusta esta solución, pero como él dijo, la anulación prefersStatusBarHiddenalterará su restricción. Hasta ahora esto hace el trabajo. Sin embargo, estoy usando un envoltorio pequeño para evitar el uso de singletons, puedes encontrarlo aquí
rgkobashi
34

si prefiere un enfoque visual en lugar de codificarlo, use este método: en su info.plist

ingrese la descripción de la imagen aquí simplemente agregue View controller-based status bar appearanceaNO

y Status bar is initially hiddencomoYES

MiladiuM
fuente
Esta es la respuesta canónica en 2018
ChrisH
28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
Mohit Tomar
fuente
28

Actualización para iOS 10 / Swift 3.0

Ya no es una función, ahora es una propiedad ...

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
fuente
¿Sabes cómo configurar esto en toda la aplicación? Actualmente tengo que ingresar esto en cada vista Controlador
William T.
Pruebe el menú Buscar, luego busque y reemplace en el proyecto. ¿Quizás? Pero esa maldita llave extra con los anidados se ... hmmm ... no sé. ¡buena pregunta!
atlwx
prefersStatusBarHidden nunca se ha llamado
Bagusflyer
66
No necesita el get { }si no tiene un set, solo escribareturn true
Daniel
16

en Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Samira Ekrami
fuente
Esto está en desuso en iOS 9.0
Georgios
16

Vaya a su Info.plist y agregue dos claves:

Vaya a su Info.plist y agregue dos claves:

janaz
fuente
12

Entonces, el problema aquí en realidad no tiene nada que ver con Swift, sino cómo se maneja la apariencia de la barra de estado a partir de iOS 7.

Por defecto, los controladores de vista controlan individualmente la apariencia de la barra de estado cuando están en la pantalla. Si desea utilizar este método para controlar la barra de estado, puede anular los siguientes métodos para cualquier controlador de vista para el que desee modificar la apariencia:

prefersStatusBarHidden` preferredStatusBarStyle` preferredStatusBarAnimation ,

En su caso, simplemente implementaría prefersStatusBarHiddeny devolveríatrue .

La otra forma sería controlar la apariencia de la barra de estado en el nivel de la aplicación. Esto parece ser lo que realmente estás tratando de hacer (configurando application.statusBarHidden).

Para que esto funcione, debe abrir el Info.plistarchivo de su aplicación y agregar la clave UIViewControllerBasedStatusBarAppearance, y darle un valor de NO.

Dima
fuente
1
Creo que te refieres a return true para prefersStatusBarHidden. NO pertenece a ObjC y de todos modos es el valor de bool incorrecto.
HenryRootTwo
@HenryRootTwo no está en archivos .plist. Allí todavía usamos SÍ / NO
Alex Salom
8

De hecho, lo descubrí yo mismo. Agregaré mi solución como otra opción.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Arrendajo
fuente
Buen enfoque para mantener las cosas limpias y modulares
Roger Fernandez Guri
2
No puedo implementar esto. Tal vez sea porque ahora uso Swift 1.2. Recibo el error: "El método 'prefersStatusBarHidden ()' con el selector Objective-C 'prefersStatusBarHidden' entra en conflicto con la declaración anterior con el mismo selector Objective-C". También he agregado la palabra clave de anulación al principio, pero sigo teniendo el mismo error.
Andrej
¿Necesita agregar esto a cada vista?
Sean
No funciona en Swift 2, muestra un error como se explica anteriormente en @Andrej.
Nagendra Rao
4

De acuerdo, por lo que este se convierta en un problema para mí ya que iOS 9 no admite ningún método por encima de la gente han mencionado aquí como UIApplication.sharedApplication().statusBarHidden = true o

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

y

override func prefersStatusBarHidden() -> Bool {
     return true
}

funciona pero no proporciona una solución programable donde pueda cambiar una condición. ( statusBarHidden = trueystatusBarHidden = false como hemos hecho antes).

Solución a esta locura:

Al agregar a MeprefersStatusBarHidden() gusta a continuación, puede controlar mediante programación el escondite de la barra de estado sin agregar la UIViewControllerBasedStatusBarAppearanceconfiguración a su info.plist :

var showStatusBar = true

override func prefersStatusBarHidden() -> Bool {
     if showStatusBar {
         return false
     }
     return true
}

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

luego úsalo así en todo tu código:

//Hide Status Bar
showStatusBar(false)

O

//Show Status Bar
showStatusBar(true)
CodeOverRide
fuente
1
¿Tiene prefersStatusBarHiddensentido llamar? Supongo que te refieres self.setNeedsStatusBarAppearanceUpdate()después de showStatusBarasignar
Leo
Realmente es una locura, ¿no? Qué API tan lamentable es, y lo ha sido durante tanto tiempo. Este tipo de cosas hace que el desarrollo de iOS sea increíblemente frustrante a veces.
Womble
@Womble, sí, y también puede ser bastante complicado. Esperemos que Swift 3.0 tenga una mejor biblioteca y soporte ya que, a primera vista, cambiará mucho de Swift 2.3 ... rompiendo cosas.
CodeOverRide
En lugar de llamar a prefersStatusBarHidden desde su método, puede llamar a setNeedsStatusBarAppearanceUpdate
Oscar el
4

Solo para agregar, al anular el prefersStatusBarHiddenmétodo o la variable, la lista View controller-based status bar appearancede información debe ser SÍ, de lo contrario, la anulación no tendrá efecto

Huanyan
fuente
4

en Swift 4.2 es una propiedad ahora.

override var prefersStatusBarHidden: Bool {
    return true
}
Rawand Saeed
fuente
3

En mi caso, estaba buscando la barra de estado para ocultar / mostrar a pedido; en lugar de solo cuando la vista se carga o desaparece.

Swift 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()
Felecia Genet
fuente
3

Swift 5: en el controlador de vista principal o en el controlador de navegación principal si tiene,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Y "Ver la apariencia de la barra de estado basada en el controlador" en plist debe ser SÍ, de lo contrario no se llamará al código anterior.

Si desea ocultar la barra de estado al iniciar la aplicación, "La barra de estado está inicialmente oculta" en plist debe ser SÍ. Esto puede evitar que la imagen de inicio se distorsione cuando se muestre una barra azul adicional en la parte superior de la pantalla.

Sam Xu
fuente
2

Una solución que me funciona; si desea ocultar la barra de estado en un controlador de vista específico durante la carga:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

Atención: si configura la clave " Ver la apariencia de la barra de estado basada en el controlador " en " NO " en su información, el código anterior no funciona. Debe establecer la clave en " " o eliminarla de info.plist

andre_hold
fuente
¡No puede anular la propiedad hideStatusBar ya que es una propiedad almacenada! Sin embargo, puede elegir otro nombre y su animación funcionará.
XcodeNOOB
2

En su proyecto General-> Información de implementación-> Estilo de barra de estado seleccione la marca de verificación de Ocultar barra de estado Nota: - oculta la barra de estado en toda la aplicación

Sweta Vani
fuente
1
Esto funciona para mí (ios 12), donde las respuestas plist no lo hacen.
tres
2

Para Swift 4+ intente el siguiente código (probado en Swift 4.0, 4.1 - IOS 10, 11):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}
Codificador ACJHP
fuente
2

Swift 5+

En mi caso, necesito actualizar la barra de estado oculta en función de algunas condiciones.

Debido a esto, creo un controlador base BaseViewControllerque contiene una nueva propiedadhideStatusBar .

Otros controladores de vista son subclase de este controlador base. Finalmente, cuando quiero actualizar el comportamiento de la barra de estado, solo necesito cambiar este hideStatusBarvalor.

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Cómo utilizar

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

Manifestación

Aquí hay una demostración, estoy usando UIView.animate(...)para hacer la transición más suave.

ingrese la descripción de la imagen aquí

nahung89
fuente
1

Estoy usando Xcode 8.1 (8B62) con un objetivo de implementación establecido en 10.1 y no he tenido mucha suerte con las opciones de anulación mencionadas anteriormente. Sin embargo, comprobar la opción "Ocultar barra de estado" en Información de implementación me ayudó.

Proyecto> General

Espero que esto ayude.

danmerfeld
fuente
1

Si presenta el controlador de vista modalmente, intente

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
fuente
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
fuente
44
Al responder una pregunta, explique su respuesta, el fragmento de código no es una respuesta adecuada.
LazerBanana
0

Puedes usar este código en tu ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
Sajjad
fuente
Gracias por la respuesta, ¿te gustaría elaborar un poco más? ¿Dónde exactamente debe agregar la línea de código y por qué esto funcionaría? Vea la sección ¿Cómo escribo una buena respuesta ?
9953-div-37
0

En su Proyecto-> General-> Información de implementación

Estilo de la barra de estado: -

acaba de marcar Ocultar barra de estado (iOS 10)

VD Purohit
fuente
0

Swift 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
fuente
ok por ahora no tengo ningún iOS 12 tengo 11.4 cuando su actualización lo arregle también, también si tienes teamviewer vendré y lo arreglaré en tu sistema
Shakeel Ahmed
está en desuso
Vyachaslav Gerchicov
0

Actualizado para iOS 13 y Swift 5

Si ninguna de las respuestas anteriores funciona para usted. Verifique su lista para ver si tiene esto:

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

Si es así, asegúrese de configurarlo en SÍ !!!!!

Entonces el siguiente código funcionará.

override var prefersStatusBarHidden: Bool {
    return true
}
Legolas Wang
fuente