En mi iPhone la aplicación construida con Xcode 5 para iOS 7 me puse UIViewControllerBasedStatusBarAppearance=YES en info.plist, y en mi ViewController tengo este código:

-(UIStatusBarStyle) preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Pero la barra de estado sigue en negro sobre el fondo negro.

Sé que es posible cambiar esta aplicación, estableciendo UIViewControllerBasedStatusBarAppearance=NO en info.plist, pero yo en realidad necesidad de alterar esta en un viewController por viewController base en tiempo de ejecución.

InformationsquelleAutor Andrew Smith | 2013-10-01

16 Comentarios

  1. 277

    Descubrí que si su ViewController está dentro de un navigationController, a continuación, el navigationController del navigationBar.barStyle determina la statusBarStyle.

    Configuración de su navigationBar del barStyle a UIBarStyleBlackTranslucent dará blanca texto de barra de estado (es decir. UIStatusBarStyleLightContent), y UIBarStyleDefault dará negro texto de barra de estado (es decir. UIStatusBarStyleDefault).

    Nota que esto se aplica incluso si usted cambiar totalmente el navigationBar del color a través de su barTintColor.

    • Esto no tiene ningún sentido para mí, pero funciona! Gracias.
    • esto tiene sentido para mí…gran
    • Yo creo que es porque el UINavigationController‘s preferredStatusBarStyle no llamar a través de a la ViewController que alberga, y en lugar de sólo devuelve basado en su navigationBarStyle.
    • En este caso el punto de vista no está dentro de un controlador de navegación.
    • Muy ilógico pensar que el estilo de la barra tiene preferencia sobre un método implementado en el controlador de vista, y sólo cuando la presentación de modal vistas!
    • tantas respuestas por ahí, este es por lejos la mejor solución
    • Este es el único que trabajó para mí y tengo que decir que me parece contra intuitivo.
    • UIBarStyleBlackTranslucent está en desuso, uso UIBarStyleBlack lugar
    • 2018 – navigationBar.barStyle = UIBarStyle.blackTranslucent
    • El UINavigationController es un contenedor de controlador de vista, como se ha mencionado por @mxcl utiliza su default preferredStatusBarStyle. Hay un childViewControllerForStatusBarStyle que está destinado a ser reemplazado por el contenedor de vista controlador para proporcionar el controlador de vista de los preferidos de la barra de estado estilo. En mi opinión, la UINavigationController debe proporcionar por defecto de la parte superior de la empujó controlador de vista como su implementación predeterminada. De todos modos, puede que necesite subclase (o el uso de una categoría) para la nav controlador para personalizar childViewControllerForStatusBarStyle .
    • Aparece la forma recomendada de ahora es establecer que la barra de navegación… «isTranslucent = true» y «barStyle = .negro».

  2. 86

    OK, aquí está el truco. Usted tiene que agregar la clave de la «Visión basada en el controlador de la barra de estado» y establecer el valor a No.

    Esto es contrario a lo que parece que el significado de esta clave es, pero incluso si se establece el valor a No, usted todavía puede cambiar la apariencia de la barra de estado, y si se muestra o no en cualquier controlador de vista. Por lo tanto, actúa como «Sí», pero se ajusta a «No»!

    Ahora puedo hacer la barra de estado blanco o negro.

    • Para mí que esto estaba mal. La llave necesaria para ser ajustado a «Sí», como era de esperar. Estoy en Xcode 5.1 de iOS 7.1, por lo que tal vez sea cambiado.
    • Estoy usando Xcode iOS 5.1 y 7.1 así y NO funcionó para mí… EXTRAÑO.
    • Donde debo agregar esta clave?
    • En su [Aplicación]-Info.archivo plist
    • Funciona bien cuando «Vista basada en el controlador de la barra de estado» clave «YES» con Xcode6.0, iOS 8.0
    • Funcionará sólo si se establece «la Vista basada en el controlador de la barra de estado» tecla «SÍ». He probado en Xcode8.1, iOS10.1
    • A mí me ha funcionado con un SÍ, pero sólo después de su creación en NO y, a continuación, volver a SÍ primero.
    • Puede eliminar esta clave ahora como está por defecto en las nuevas versiones de Xcode.

  3. 72

    Para preferredStatusBarStyle() a trabajar dentro de UINavigationController y UITabBarController me agregue el código siguiente, que obtendrá el preferido de la barra de estado estilo de la que actualmente visible de la vista controlador.

    extension UITabBarController {
        public override func childViewControllerForStatusBarStyle() -> UIViewController? {
            return selectedViewController
        }
    }
    
    extension UINavigationController {
        public override func childViewControllerForStatusBarStyle() -> UIViewController? {
            return visibleViewController
        }
    }

    Para Swift 3 los que no son métodos y propiedades:

    extension UITabBarController {
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return selectedViewController
        }
    }
    
    extension UINavigationController {
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return visibleViewController
        }
    }

    La Swift 4.2 propiedades han cambiado el nombre:

    extension UITabBarController {
       open override var childForStatusBarStyle: UIViewController? {
            return selectedViewController
        }
    }
    
    extension UINavigationController {
       open override var childForStatusBarStyle: UIViewController? {
            return visibleViewController
        }
    }

    Uso

    class ViewController: UIViewController {
    
        //This will be called every time the ViewController appears
        //Works great for pushing & popping
        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    
    }
    • Este es por lejos la mejor respuesta(Para las aplicaciones que usan UINavigationController o UITabBarController
    • ¿cuál es el uso para esto?
    • estos métodos son utilizados por UIKit. Usted no necesita hacer nada más que añadir a su proyecto.
    • sí, me imaginé que fuera y olvidé por completo que he usado exactamente lo mismo en uno de mis proyectos anteriores, aunque de forma ligeramente diferente.
    • si puedo upvote 10 veces – me gustaría
    • Este hecho es la mejor respuesta
    • Bravo!! upvoted su respuesta, y esta es, por lejos, bien merecido. El único problema que estoy teniendo ahora es cuando me descartar de forma modal presentado pantalla (pantalla tenía un encendedor de la barra de estado y después de despedir a la nueva pantalla tiene por defecto/más oscuro de la barra de estado) se cambia la barra de estado a la luz.

  4. 33

    Se me puede venir a esta un poco tarde, pero en caso que alguien más está buscando un trabajo y verificado la aplicación amplia de la solución.

    @mxcl es correcto en la descripción de por qué está sucediendo esto. Para corregir esto, simplemente debemos crear una extensión (o categoría en obj-c) que anula el preferredSatusBarStyle() método de UINavigationController. Aquí está un ejemplo rápido:

    extension UINavigationController {
        public override func preferredStatusBarStyle() -> UIStatusBarStyle {
            if let rootViewController = self.viewControllers.first {
                return rootViewController.preferredStatusBarStyle()
            }
            return super.preferredStatusBarStyle()
        }
    }

    Este código simplemente extrae el primer punto de vista controlador (la raíz de vista controlador) y se desenvuelve (en obj-c, basta con comprobar que no es nil). Si la manta es correcta (no nulo) entonces obtenemos las rootViewControllers preferredStatusBarStyle. De lo contrario, acabamos de regresar el valor predeterminado.

    Espero que esto ayude a alguien que lo necesite.

    • En Swift 2.0 debe quitar «como? UIViewController» de la instrucción de una condición.
    • Genial, hice una modificación, además de la eliminación de los «como» declaración», he cambiado lo de «primera» a «última» de este modo, de cualquier controlador de vista está siendo visto por el usuario en la parte superior de la pila tendrá la capacidad para controlar el color de la barra de estado. Impresionante el trabajo, gracias por compartir!
    • Si su controlador de navegación no tiene ninguna vista de los controladores, esto podría provocar un bucle infinito. return self.preferredStatusBarStyle() llamaría de nuevo en esta exactamente el mismo método.
    • En mi caso, en lugar de utilizar el rootViewController, he utilizado el topViewController como durante la pila el estilo puede cambiar.
    • sería aún mejor
    • Perfecto! Eso es incluso mejor @Cœur
    • Estamos volviendo de super, no yo.

  5. 21

    Para proporcionar más detalle en el aceptado como respuesta, poner la siguiente línea en la aplicación del delegado didFinishLaunchingWithOptions: método:

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

    A continuación, en el Info.plist, agregar View controller-based status bar appearance y configurarlo para que NO.

    Yo creo que es como debe ser, NO desde la navegación por el controlador, si desea que la misma barra de estado de color para toda la aplicación. Usted podría tener pantallas que no son necesariamente incrustado en un UINavigationController, o una diferente UINavigationController subclase en otro lugar y otras cosas.

    EDITAR: también se puede hacer sin necesidad de escribir ningún código: https://stackoverflow.com/a/18732865/855680

    • Tenga en cuenta que de esta manera está en desuso desde IOS 9.0
  6. 10

    En viewDidLoad acaba de escribir este

    [self setNeedsStatusBarAppearanceUpdate];

    acaba de hacer eso y se va a trabajar

    u puede por favor trate de esta

    Set UIViewControllerBasedStatusBarAppearance to NO.
    Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    Una cosa más que he visto en tu pregunta que
    usted tiene escribió el método como este

     -(void)UIStatusBarStyle PreferredStatusBarStyle ()
            {
                return UIStatusBarStyle.LightContent;
            }

    pero debe ser como esto

    -(UIStatusBarStyle)preferredStatusBarStyle{ 
        return UIStatusBarStyleLightContent; 
    } 
    • Esto hace que la preferredStatusBarStyle método, pero todavía la barra de estado es de color negro.
    • por favor, ver mi respuesta actualizada..déjame saber rápidamente si funciona o no
    • Mi pregunta original explícitamente dice que tengo que hacer ver por vista de control de la barra de estado.
    • u puede por favor revise su código con referencia a mi actualizados pregunta?
    • He editado el post original, para mostrar lo que estoy haciendo en realidad. Todavía no está trabajando. De nuevo, necesito establecer UIViewControllerBasedStatusBarAppearance a NO.
    • stackoverflow.com/questions/17678881/… por favor, consulte este enlace
    • Sí, ese vínculo está de acuerdo conmigo, no funciona a menos que usted establezca UIViewControllerBasedStatusBarAppearance para el NO y el conjunto de la barra de herramientas a nivel mundial.
    • ok..la esperanza de encontrar esta respuesta útil
    • [self setNeedsStatusBarAppearanceUpdate]; un gran método, gracias!

  7. 5

    Aquí es cómo lo resolví. Generalmente el navigationController o tabBarController son quienes deciden la apariencia de la barra de estado (oculta, color, etc).

    Así que terminó subclases de la navegación y del controlador de primordial preferredStatusBarStyle. si el actual visible ViewContorller implementa StatusBarStyleHandler pido el valor a ser utilizado como el estilo, si no me devuelven un valor predeterminado.

    La manera de desencadenar una actualización de la barra de estado de la apariencia está llamando setNeedsStatusBarAppearanceUpdate que desencadena preferredStatusBarStyle de nuevo y actualizaciones de la interfaz de usuario de acuerdo a lo que el método devuelve

    public protocol StatusBarStyleHandler {
        var preferredStatusBarStyle: UIStatusBarStyle { get }
    }
    
    public class CustomNavigationCotnroller: UINavigationController {
    
        public override var preferredStatusBarStyle: UIStatusBarStyle {
            if let statusBarHandler = visibleViewController as? StatusBarStyleHandler {
                return statusBarHandler.preferredStatusBarStyle
            }
    
            return .default
        }
    }

    El uso

    public class SomeController: UIViewController, StatusBarStyleHandler {
    
        private var statusBarToggle = true
    
        //just a sample for toggling the status bar style each time method is called
        private func toggleStatusBarColor() {
            statusBarToggle = !statusBarToggle
            setNeedsStatusBarAppearanceUpdate()
        }
    
        public override var preferredStatusBarStyle: UIStatusBarStyle {
            return statusBarToggle ? .lightContent : .default
        }
    }
    • Este post sería mucho mejor si se pudiera explicar por qué y cómo esto soluciona el problema.
    • En lugar de crear subclases de UINavigationController también puede crear una extensión para UINavigationController y lograr el mismo resultado sin tener a la subclase.
  8. 4

    Incluso con todas las respuestas aquí todavía no encontrar la solución exacta para mí, pero empezó con la respuesta de Daniel. Lo que terminó con:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         return visibleViewController?.preferredStatusBarStyle ?? .lightContent
    }

    en la navegación de los controladores (similar para la ficha, sólo selectedViewController). Y, a continuación, se va a respetar el:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         return .lightContent
    }

    En cada controlador de vista a menos que se establezca lo contrario. No necesito llamar a setNeedsStatusBarAppearanceUpdate() en cualquier lugar, lo que hace es actualizar al llegar a cada controlador de vista.

    • Terminé con la casi idéntica solución después de luchar con esto durante horas.
    • En algún momento, este parece haber sido solucionado, simplemente utilizando preferredStatusBarStyle en cada VC funciona muy bien para mí ahora.
  9. 3

    1) Una configuración para todo el proyecto:

    Si está disponible, quitar UIViewControllerBasedStatusBarAppearance par clave-valor de su información.plist, o conjunto de NO sin quitarlo. Si no está disponible en tu info.plist, no hacer nada. Por defecto es NO para esta propiedad.

    Añadir a continuación el código a su AppDelegate.m:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    }

    2) valores Distintos para diferentes Vistas de los Controladores:

    Agregar UIViewControllerBasedStatusBarAppearance par clave-valor a su información.plist y configurarlo para que YES.

    Si su Controlador de Vista no es incrustar en la Navegación del Controlador. Digamos que MyViewController. sólo agregue el código siguiente a la MyViewController.m archivo. Si su Controlador de Vista es incrustar en la Navegación Controlador, crear una nueva Cacao Toque de Clase y hacer que sea subclase de UINavigationController. Digamos que MyNC. Seleccione Navegación Controlador de la Vista en su Guión, en el panel de la derecha; Servicios> Identidad Inspector -> Clase Personalizada -> de la Clase, escriba «MyNC». Después de la vinculación de la Vista de Guión gráfico con su «MyNC» Cocoa Touch Clase, agregue el código siguiente a la MyNC.m:

    - (BOOL)prefersStatusBarHidden {
        return NO;
    }
    
    -(UIStatusBarStyle)preferredStatusBarStyle {
        return UIStatusBarStyleLightContent;
    }
    • Parece que en iOS9 UIViewControllerBasedStatusBarAppearance por defecto contiene el valor SÍ, tuve que agregar manualmente en .plist y configurado para que NO funcione correctamente.
  10. 2

    Swift 4.2

    extension UITabBarController {
       open override var childForStatusBarStyle: UIViewController? {
            return selectedViewController
        }
    }
    
    extension UINavigationController {
       open override var childForStatusBarStyle: UIViewController? {
            return visibleViewController
        }
    }
  11. 1

    Si en caso de que usted quería ocultar la barra de estado durante splashScreen, pero quería cambiar el estilo a la luz de contenido (StatusBarInitiallyHidden en Plist tiene que ser NO para ocultar la barra de estado en splash), puede agregar esto a appDelegate del método didFinishLaunchingWithOptions para cambiar a lightContent.

    [[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
  12. 1

    swift ejemplo

    en el AppDelegate.swift

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent;
    
        return true
    }

    de información.plist Opinión basada en el controlador de la barra de estado de la apariencia: NO

  13. 1

    Si usted está usando NavigationController, puede subclase NavigationController así que consulta su hijo controlador de vista de

    //MyCustomNavigationController

    - (NSUInteger)supportedInterfaceOrientations {
        UIViewController *viewControllerToAsk = [self findChildVC];
        return [viewControllerToAsk supportedInterfaceOrientations];
    }
    
    - (BOOL)shouldAutorotate {
        UIViewController *viewControllerToAsk = [self findChildVC];
        return [viewControllerToAsk shouldAutorotate];
    }
    
    - (UIStatusBarStyle)preferredStatusBarStyle {
        UIViewController *viewControllerToAsk = [self findChildVC];
        return [viewControllerToAsk preferredStatusBarStyle];
    }
    
    - (UIViewController *)findChildVC {
        return self.viewControllers.firstObject;
    }
  14. 0

    Puede configurar la barra de estado estilo. Se asemeja a la barra de estado como IOS 6 y siguientes.

    La pasta de este método en el controlador de vista de

    -(UIStatusBarStyle)preferredStatusBarStyle{
        return UIStatusBarStyleBlackOpaque;
    }

    y llamar a este método desde la vista hizo de carga como esta

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
        {
           [self setNeedsStatusBarAppearanceUpdate];
        }
    • El Apple docs decir UIStatusBarStyleBlackOpaque está en desuso
    • Trató de que no funcionó.
    • A qué te refieres [self setStatusBarNeedsUpdate] en el segundo bloque? (O algo menos).
    • respuesta actualizada por favor consulte.
  15. 0

    Solo quiero añadir una nota para un caso concreto que me enfrentaba. Yo tenía otro UIWindow en mi app para mostrar una charla cara a ser flotante en todo mi aplicación en todo momento. Haciendo esto provocó que ninguno de la solución anterior a la obra, y no estoy realmente seguro de por qué! Todo lo que he notado es que mi ViewController en el nuevo UIWindow fue la razón para que! Y si yo quería cambiar la barra de estado estilo que tengo que hacer en el controlador de vista de la nueva UIWindow.

    Esta nota puede ayudar a otros que tienen una estructura similar! Así que, básicamente, puede aplicar las soluciones mencionadas en el ViewController de la nueva UIWindow.

    De nuevo este un caso específico.

    Gracias

  16. -1

    Para swift 3, en su UIViewController:

    override var preferredStatusBarStyle : UIStatusBarStyle { return UIStatusBarStyle.lightContent }

Dejar respuesta

Please enter your comment!
Please enter your name here