He seguido este hilo para reemplazar -preferredStatusBarStyle, pero no se llama así.
¿Hay alguna opción de que puedo cambiar para activarlo? (Estoy usando XIBs en mi proyecto.)

  • No se llama en qué contexto: simulador? en un dispositivo?
  • ambos de ellos.
  • Estás usando el simulador de iOS 7, un dispositivo de iOS 7, y su SDK base es la 7.0?
  • SDK de iOS 7.0 se muestran debajo de mi nombre de proyecto, es que los medios de mi base SDK 7.0?
  • En la configuración de generación, de la «Base» del SDK es donde se establece el valor. Parece que su proyecto se establece a 7.0.
  • sí, aficionado a ella, así que ¿cuál es mi problema? se me hace una locura! por favor, ayúdame!
  • permítanos continuar esta discusión en el chat

InformationsquelleAutor trgoofi | 2013-09-26

21 Comentarios

  1. 113

    Posible causa raíz

    Tuve el mismo problema, y averiguar lo que estaba pasando porque yo no estaba en la configuración de la raíz vista controlador en mi ventana de la aplicación.

    La UIViewController en la que yo había puesto en marcha el preferredStatusBarStyle fue utilizado en un UITabBarController, que controla la apariencia de las vistas en la pantalla.

    Cuando me puse la raíz de vista controlador a punto para este UITabBarController, el estado de cambios en la barra comenzó a trabajar correctamente, como se esperaba (y la preferredStatusBarStyle método fue recibir llamadas).

    (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ... //other view controller loading/setup code
    
        self.window.rootViewController = rootTabBarController;
        [self.window makeKeyAndVisible];
        return YES;
    }

    Método alternativo (en Desuso en iOS 9)

    Alternativamente, usted puede llamar a uno de los métodos siguientes, según corresponda, en cada uno de su punto de vista de los controladores, dependiendo de su color de fondo, en lugar de tener que utilizar setNeedsStatusBarAppearanceUpdate:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    o

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

    Tenga en cuenta que usted también tendrá que establecer UIViewControllerBasedStatusBarAppearance a NO en el archivo plist si utiliza este método.

    • Tengo el mismo problema que tú, no la configuración de la raíz de controlador de vista. Cómo diablos has encontrado eso?
    • Yo sospechaba que algo en el marco no estaba recibiendo la notificación de setNeedsStatusBarAppearanceUpdate – mis sospechas fueron confirmadas cuando hice este cambio.
    • Un problema relacionado con el que me he encontrado en una aplicación de un controlador de vista con una completa pantalla de niño controlador de vista de que no invalidar childViewControllerForStatusBarStyle y childViewControllerForStatusBarHidden para volver a ese niño controlador de vista. Si usted tiene su propio controlador de vista de la jerarquía que usted necesita para proporcionar estos métodos para informar al sistema de que la vista controlador debe ser utilizado para determinar el estado de la barra de estilo.
    • ajuste de la rootviewcontroller no cambia nada. Usted debe trabajar con el comentario de Jon. Y tener cuidado cuando se llama a setneedsstatusbarappearanceUpdate. Usted debe llamar desde el padre al trabajo.
    • ustedes son geniales!! ¿Cómo crees que fue a causa de que no rootviewcontroller?
    • y lo que sobre para ocultar la barra de estado en rootViewController y mostrar en todos los demás niño con UIStatusBarStyleLightContent
    • Este es un viejo problema, pero para aquellos de entre nosotros tropezar con ese problema a día de hoy me gustaría recomendar el uso de modalPresentationCapturesStatusBarAppearance por el no a pantalla completa modal de transición. Esto ayudó a ser con un problema en iOS8, y es una costumbre de transición.
    • Ser consciente de que esta alternativa de solución está en desuso desde iOS 9.0 ([[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];)
    • este es obsoleta en ios 9

  2. 986

    Para cualquier persona que utiliza un UINavigationController:

    La UINavigationController no avanzar en preferredStatusBarStyle las llamadas a su hijo a la vista de los controladores. Lugar en que maneja su propio estado – como debería, es el dibujo en la parte superior de la pantalla en la barra de estado de la vida y así debe ser responsable de eso. Para ello la aplicación de preferredStatusBarStyle en su VCs dentro de un nav el controlador va a hacer nada – de que nunca va a ser llamado.

    El truco es lo que el UINavigationController utiliza para decidir qué volver para UIStatusBarStyleDefault o UIStatusBarStyleLightContent. Se basa esta en su UINavigationBar.barStyle. El valor predeterminado (UIBarStyleDefault) resultados en la oscuridad de primer plano UIStatusBarStyleDefault barra de estado. Y UIBarStyleBlack dará un UIStatusBarStyleLightContent barra de estado.

    TL;DR:

    Si quieres UIStatusBarStyleLightContent en un UINavigationController uso:

    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    • Bueno! Tenga en cuenta que preferredStatusBarStyle en realidad se llama el hijo de controlador de vista si se puede ocultar la barra de navegación (conjunto de navigationBarHidden a YES), exactamente como sea apropiado.
    • Gracias por esta respuesta. Si desea establecer la barStyle para todas sus barras de navegación, llamada [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
    • La respuesta perfecta. Ninguna de las otras respuestas en los UINavigationController en consideración. 2 horas de golpear mi cabeza contra el teclado.
    • Gran consejo y usted puede hacerlo desde el Guión también.
    • Esto también tiene el beneficio añadido de la eliminación de los píxeles de la sombra en la parte inferior de la navigationBar parece.
    • Tenga en cuenta que esto va a cambiar el color de todos los puntos de vista utilizando el navegador controlador, por lo que necesita volver a establecer UIBarStyleDefault cuando sea necesario. Yo lo hice por hacer la llamada, en la parte de Atrás de eventos de botón.
    • Si utiliza este método, se termina el cambio de la barra de navegación de color además de la barra de estado. Si usted sólo desea que la barra de estado, esto no funciona, afaict.
    • Felicitaciones a @Patrick para indicar que navigationBarHidden conjunto para YES en realidad tienen preferredStatusBarStyle llamado, y una advertencia a los que podría tropezar en esto: no funciona con navigationBarHidden, pero no con navigationBar.hidden!
    • no me funciona
    • [[UINavigationBar apariencia] setBarStyle:UIBarStyleBlack];
    • debería ser obvio, pero también es necesario «controlador de Vista basados en la barra de estado de la apariencia» si Info.plist para que esto funcione.
    • Si puedo configurar el estilo de la barra de UIBarStyleBlack , el var matiz de color se vuelve de un gris muy oscuro. Pero quiero mantener mi barra de matiz de color (en este caso, de un color azul oscuro – por eso necesito la luz de contenido).
    • He seguido este pero id no funciona. Incluso si he añadido controlador de Vista basados en la barra de estado de la apariencia» si info.plist. Sin embargo, la extensión de @serenn funcionó a la perfección
    • En iOS 9.2 sigue trabajando! Gj!
    • Buena respuesta! Gracias.
    • Creo que esto se debe considerar como la respuesta correcta! Me salvó la vida!
    • Si se han anidado VC en un controlador de navegación, usted tiene que hacerlo de esta manera. También asegúrese de que su Controlador de Vista preferente de su información.plist está establecida en SÍ.
    • Para Swift 3 hacer self.navigationController?.navigationBar.barStyle = .black
    • GRACIAS. Holy moly, iOS es de lo peor a veces. Si no fuera por la vivacidad de los colaboradores de Desbordamiento de Pila, me han abandonado esta plataforma hace mucho tiempo.
    • Me parece que no puede conseguir que esto funcione en iOS 10. No cualquiera consigue el mismo problema?
    • De acuerdo a @CodeBaller conjunto View controller-based status bar appearance a YES en su Información.plist

  3. 97

    Así que realmente he añadido una categoría para UINavigationController pero que se utilizan los métodos:

    -(UIViewController *)childViewControllerForStatusBarStyle;
    -(UIViewController *)childViewControllerForStatusBarHidden;

    y tuvo devolver la actual visible UIViewController. Que permite la actual visible de la vista controlador establezca su propio estilo preferido/visibilidad.

    Aquí una completa fragmento de código: la

    En Swift:

    extension UINavigationController {
    
        public override func childViewControllerForStatusBarHidden() -> UIViewController? {
            return self.topViewController
        }
    
        public override func childViewControllerForStatusBarStyle() -> UIViewController? {
            return self.topViewController
        }
    }

    En Objective-C:

    @interface UINavigationController (StatusBarStyle)
    
    @end
    
    @implementation UINavigationController (StatusBarStyle)
    
    -(UIViewController *)childViewControllerForStatusBarStyle {
        return self.topViewController;
    }
    
    -(UIViewController *)childViewControllerForStatusBarHidden {
        return self.topViewController;
    }
    
    @end

    Y en buena medida, he aquí cómo se implementa, a continuación, en un UIViewController:

    En Swift

    override public func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
    
    override func prefersStatusBarHidden() -> Bool {
        return false
    }

    En Objective-C

    -(UIStatusBarStyle)preferredStatusBarStyle {
        return UIStatusBarStyleLightContent; //your own style
    }
    
    - (BOOL)prefersStatusBarHidden {
        return NO; //your own visibility code
    }

    Por último, asegúrese de que su aplicación plist no NO tienen el «controlador de Vista basados en la barra de estado de la apariencia» NO.» Eliminar esa línea o se establece en SÍ (que creo que es el predeterminado ahora para iOS 7?)

    • Parece return self.topViewController; que funciona para mí, pero return self.visibleViewController; – no
    • visibleViewController puede devolver actualmente se presentan modal controlador al descartarla. Que es lástima. Uso topViewController.
    • Esta es la mejor respuesta que he visto sobre el tema hasta ahora, y la única respuesta, donde el escritor no tiene miedo a establecer el «controlador de Vista basado en la apariencia de la barra de estado» en SÍ (que es el predeterminado). Bien hecho.
    • Reemplazar métodos de marco en una categoría es una idea realmente mala.
    • por qué?
    • href=»http://stackoverflow.com/questions/5272451/overriding-methods-using-categories-in-objective-c» title=»sustitución de métodos utilizando categorías en objective c»>stackoverflow.com/questions/5272451/… en este tema se explica bastante bien
    • ok, pero no creo que ninguno de estos problemas se aplican aquí. Usted no necesita llamar a super en este método y de que realmente desea cambiar el comportamiento de todos los controladores de este tipo
    • Esta es la mejor respuesta que he visto:) DEBE SER ACEPTADO por la RESPUESTA:)
    • este no es trabajo para mí en iOS 9.3. Supongo que este es el problema: Este tema es de particular importancia debido a que muchos de los de Cacao clases se llevan a cabo utilizando las categorías. Un marco definido por el método intenta anular puede que sí han sido implementados en una categoría, y por lo que la aplicación tiene prioridad no está definida.
    • ¿Cómo se hace para iOS10, swift3?

  4. 62

    Para aquellos que todavía luchando con esto, esta simple extensión en swift debería solucionar el problema para usted.

    extension UINavigationController {
        override open var childViewControllerForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    }
    • Usted sir merecen una medalla.
    • Muchas gracias por esto!!!
    • Muchas gracias hombre. Tenía que regresar a visibleViewController lugar sin éxito.
    • Thanx montones!!! Sí, es darle a este hombre una medalla!!!
    • Pongo esta dentro de mi controlador de vista de que fue empujado, que no consigue llamado.
    • Este es el oro. Tengo una navegación controlador incrustado en una barra de pestañas y me acaba de lanzar esta en un archivo y ahora puedo cambiar la barra de estado de la apariencia a donde yo quiera.
    • Gracias trabajado swift 5

  5. 15

    Tyson respuesta es la correcta para cambiar la barra de estado de color a blanco en UINavigationController.

    Si alguien quiere conseguir el mismo resultado escribiendo el código en AppDelegate, a continuación, utilizar a continuación el código y escribir dentro de AppDelegate's didFinishLaunchingWithOptions método.

    Y no olvides poner el UIViewControllerBasedStatusBarAppearance a YES en el .plist archivo, de lo contrario el cambio no se reflejará.

    Código

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         //status bar appearance code
         [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
    
         return YES;
    }
  6. 13

    Mi app utiliza los tres: UINavigationController, UISplitViewController, UITabBarController, por lo tanto todos ellos parecen tomar el control de la barra de estado y hará que preferedStatusBarStyle para no ser llamado por sus hijos. Para anular este comportamiento puede crear una extensión igual que el resto de las respuestas se ha mencionado. Aquí es una extensión para todos los tres, en Swift 4. Deseo de Apple fue más claro sobre este tipo de cosas.

    extension UINavigationController {
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    
        open override var childViewControllerForStatusBarHidden: UIViewController? {
            return self.topViewController
        }
    }
    
    extension UITabBarController {
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return self.childViewControllers.first
        }
    
        open override var childViewControllerForStatusBarHidden: UIViewController? {
            return self.childViewControllers.first
        }
    }
    
    extension UISplitViewController {
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return self.childViewControllers.first
        }
    
        open override var childViewControllerForStatusBarHidden: UIViewController? {
            return self.childViewControllers.first
        }
    }

    Edición: Actualización para Swift 4.2 cambios en el API

    extension UINavigationController {
        open override var childForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    
        open override var childForStatusBarHidden: UIViewController? {
            return self.topViewController
        }
    }
    
    extension UITabBarController {
        open override var childForStatusBarStyle: UIViewController? {
            return self.children.first
        }
    
        open override var childForStatusBarHidden: UIViewController? {
            return self.children.first
        }
    }
    
    extension UISplitViewController {
        open override var childForStatusBarStyle: UIViewController? {
            return self.children.first
        }
    
        open override var childForStatusBarHidden: UIViewController? {
            return self.children.first
        }
    }
    • Esta es la única solución que funciona. Todas las respuestas en MODO punto a la solución estándar que no va a funcionar para cualquier aplicación con NavigationControllers. Gracias!!!
    • Funcionó! Gracias! Estoy usando Swift 5 ahora.
  7. 9

    Una adición a la Hipopótamo respuesta: si usted está usando un UINavigationController, entonces es probablemente mejor para agregar una categoría:

    // UINavigationController+StatusBarStyle.h:
    
    @interface UINavigationController (StatusBarStyle)
    
    @end
    
    
    
    // UINavigationController+StatusBarStyle.m:
    
    @implementation UINavigationController (StatusBarStyle)
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        //also you may add any fancy condition-based code here
        return UIStatusBarStyleLightContent;
    }
    
    @end

    Que la solución es probablemente mejor que la conmutación de pronto-a-ser obsoleto comportamiento.

    • No hagas esto, por ahora funciona, pero se puede romper el comportamiento futuro. Acaba de cambiar la barra de navegación de estilo – ver mi respuesta stackoverflow.com/a/19513714/505457
    • Usted debe utilizar la subclase,no en la categoría.
    • 2Tyson: por Qué va a romper su comportamiento futuro? preferredStatusBarStyle: es el preferido de Apple método para configurar la Barra de Estado estilo.
    • 2shuiyouren: ¿por Qué debería aumentar la complejidad de la creación de subclases si puedo usar una categoría y se incluyen en cada lugar donde voy a? De todos modos, esa es una cuestión de arquitectura, no de la ejecución.
    • Debido a que el UINavigationController ya implementa preferredStatusBarStyle y no UINavigationController lógica específica. Ahora esta lógica se basa en navigationBar.barStyle pero puedo ver comprobaciones adicionales para ser añadidos (por ejemplo, UISearchDisplayController movimiento para ocultar la barra de navegación de modo). Reemplazando el valor predeterminado de la lógica que se pierda toda esta funcionalidad y dejar abierto para el molesto ‘wtf’ momentos en el futuro. Ver mi respuesta anterior para la manera correcta de hacer esto mientras se sigue sosteniendo en-construido nav controlador de comportamiento.
  8. 8

    @serenn del respuesta anterior es todavía un gran uno para el caso de UINavigationControllers. Sin embargo, para swift 3 el childViewController funciones han cambiado para vars. Así que el UINavigationController código de extensión deberá ser de:

    override open var childViewControllerForStatusBarStyle: UIViewController? {
      return topViewController
    }
    
    override open var childViewControllerForStatusBarHidden: UIViewController? {
      return topViewController
    }

    Y, a continuación, en la vista controlador que debe dictar la barra de estado estilo:

    override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
    }
  9. 8

    En un UINavigationController, preferredStatusBarStyle no se llama porque su topViewController es preferido a self. Así, para obtener preferredStatusBarStyle llamado en un UINavigationController, usted necesita para cambiar su childViewControllerForStatusBarStyle.

    Para hacer de ella un UINavigationController (mi recomendación):

    class MyRootNavigationController: UINavigationController {
        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
        override var childViewControllerForStatusBarStyle: UIViewController? {
            return nil
        }
    }

    A hacer para todos UINavigationController (advertencia: afecta a los UIDocumentPickerViewController, UIImagePickerController, etc.):

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
        open override var childViewControllerForStatusBarStyle: UIViewController? {
            return nil
        }
    }
  10. 6

    Además serenn la respuesta, si usted está presentando un controlador de vista con un modalPresentationStyle (por ejemplo .overCurrentContext), también debe llamar a esto en el recién presentado controlador de vista:

    presentedViewController.modalPresentationCapturesStatusBarAppearance = true

    No olvides cambiar la preferredStatusBarStyle en el controlador de vista.

  11. 4

    UIStatusBarStyle en iOS 7

    La barra de estado de iOS 7 es transparente, la visión detrás de él se muestra a través.

    El estilo de la barra de estado se refiere a la apariencia de su contenido. En iOS 7, la barra de estado contenido es oscuro (UIStatusBarStyleDefault) o de la luz (UIStatusBarStyleLightContent). Ambos UIStatusBarStyleBlackTranslucent y UIStatusBarStyleBlackOpaque están en desuso en iOS 7.0. Uso UIStatusBarStyleLightContent lugar.

    Cómo cambiar UIStatusBarStyle

    Si debajo de la barra de estado es la barra de navegación, la barra de estado estilo va a ser ajustado para que coincida con la barra de navegación de estilo (UINavigationBar.barStyle):

    Específicamente, si la barra de navegación es de estilo UIBarStyleDefault, la barra de estado estilo será UIStatusBarStyleDefault; si la barra de navegación es de estilo UIBarStyleBlack, la barra de estado estilo será UIStatusBarStyleLightContent.

    Si no hay ninguna barra de navegación debajo de la barra de estado la barra de estado estilo pueden ser controlados y modificados por un punto de vista individual controlador mientras se ejecuta la aplicación.

    [UIViewController preferredStatusBarStyle] es un nuevo método agregado en iOS 7. Puede reemplazarse para devolver el preferido de la barra de estado estilo:

    - (UIStatusBarStyle)preferredStatusBarStyle
      {
          return UIStatusBarStyleLightContent;
      }

    Si la barra de estado estilo debe ser controlado por un niño de controlador de vista en lugar de auto, anular -[UIViewController childViewControllerForStatusBarStyle] para volver a ese niño controlador de vista.

    Si prefiere optar por este comportamiento y establecer la barra de estado estilo mediante el uso de la -[UIApplication statusBarStyle] método, agregar el UIViewControllerBasedStatusBarAppearance clave para una aplicación Info.plist archivo y darle el valor NO.

  12. 4

    Si alguien está usando un Controlador de Navegación y quiere que todos sus controladores de navegación para que el negro estilo, usted puede escribir una extensión para UINavigationController como este en Swift 3 y se aplicará a todos los controladores de navegación (en lugar de atribuirlo a un controlador a la vez).

    extension UINavigationController {
    
        override open func viewDidLoad() {
            super.viewDidLoad()
    
            self.navigationBar.barStyle = UIBarStyle.black
        }
    
    }
    • Pero lo que si me navigationbar está oculto?
    • Porque tengo necesidad de que la navegación sea oculta y la barra de estado para que sea visible.
    • La solución perfecta
  13. 4

    Swift 4.2 y sobre

    Como se mencionó en respuesta seleccionada, la causa raíz es la comprobación de la ventana raíz del controlador de vista del objeto.

    Los casos posibles de su flujo de estructura

    • Personalizado UIViewController objeto de la ventana raíz de controlador de vista de

      La ventana raíz de vista controlador es un UIViewController objeto y además agrega o quita de navegación controlador o tabController basado en la aplicación de flujo.

      Este tipo de flujo se utiliza generalmente si tu aplicación tiene pre flujo de inicio de sesión en una pila de navegación sin fichas y post flujo de inicio de sesión con pestañas y, posiblemente, cada ficha tiene más de navegación controlador.

    • TabBarController objeto de la ventana raíz de controlador de vista de

      Este es el flujo donde la ventana raíz de controlador de vista es tabBarController posiblemente cada ficha tiene más de navegación controlador.

    • NavigationController objeto de la ventana raíz de controlador de vista de

      Este es el flujo donde la ventana raíz de controlador de vista es navigationController.

      No estoy seguro de si existe la posibilidad de añadir de la barra de pestañas o controlador de navegación nuevo controlador existentes en un controlador de navegación. Pero si es que existe tal caso, tenemos que pasar la barra de estado estilo de control a la siguiente contenedor. Así que, he añadido el mismo cheque en UINavigationController extensión para encontrar childForStatusBarStyle

    Usar las siguientes extensiones, se encarga de todos los escenarios anteriores

    extension UITabBarController {
        open override var childForStatusBarStyle: UIViewController? {
            return selectedViewController?.childForStatusBarStyle ?? selectedViewController
        }
    }
    
    extension UINavigationController {
        open override var childForStatusBarStyle: UIViewController? {
            return topViewController?.childForStatusBarStyle ?? topViewController
        }
    }
    
    extension AppRootViewController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return children.first { $0.childForStatusBarStyle != nil }?.childForStatusBarStyle?.preferredStatusBarStyle ?? .default
        }
    }
    • Usted no necesita UIViewControllerBasedStatusBarAppearance clave en info.plist como true de forma predeterminada

    Puntos a considerar para obtener más complejos flujos de

    • En caso de que presente nuevo flujo de forma modal, que se desprende de la existente en la barra de estado de flujo de estilo. Así, supongamos que usted está presentando un NewFlowUIViewController y, a continuación, agregue un nuevo sistema de navegación o tabBar controlador para NewFlowUIViewController, a continuación, añadir la extensión de NewFlowUIViewController así a gestionar más de controlador de vista de la barra de estado estilo.

    • En caso de establecer modalPresentationStyle otros que fullScreen, mientras que la presentación de forma modal, debe establecer modalPresentationCapturesStatusBarAppearance a true para que presentó la vista controlador debe recibir de la barra de estado de control de apariencia.

    • Excelente respuesta!
  14. 1

    En Swift para cualquier tipo de UIViewController:

    En su AppDelegate conjunto:

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

    myRootController puede ser cualquier tipo de UIViewController, por ejemplo, UITabBarController o UINavigationController.

    A continuación, reemplazar esta raíz controlador como este:

    class RootController: UIViewController {
        override func preferredStatusBarStyle() -> UIStatusBarStyle {
            return .LightContent
        }
    }

    Esto va a cambiar la apariencia de la barra de estado en toda su aplicación, debido a que la raíz del controlador es el único responsable de la apariencia de la barra de estado.

    Recuerde que para establecer la propiedad View controller-based status bar appearance para SÍ, en su Info.plist para hacer este trabajo (que es el predeterminado).

    • ¿en swift3?
  15. 1

    Swift 3 iOS Solución de 10:

    override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
    }
  16. 0

    Este es mi método para la solución de este.

    Definir un protocolo llamado AGViewControllerAppearance.

    AGViewControllerAppearance.h

    #import <Foundation/Foundation.h>
    
    @protocol AGViewControllerAppearance <NSObject>
    
    @optional
    
    - (BOOL)showsStatusBar;
    - (BOOL)animatesStatusBarVisibility;
    - (UIStatusBarStyle)preferredStatusBarStyle;
    - (UIStatusBarAnimation)prefferedStatusBarAnimation;
    
    @end

    Definir una categoría en la UIViewController llamado Actualización.

    UIViewController+Actualización.h

    #import <UIKit/UIKit.h>
    
    @interface UIViewController (Upgrade)
    
    //
    // Replacements
    //
    
    - (void)upgradedViewWillAppear:(BOOL)animated;
    
    @end

    UIViewController+Actualización.m

    #import "UIViewController+Upgrade.h"
    #import <objc/runtime.h>
    #import "AGViewControllerAppearance.h" //This is the appearance protocol
    @implementation UIViewController (Upgrade)
    + (void)load
    {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wselector"
    Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
    #pragma clang diagnostic pop
    Method upgradedViewWillAppear = class_getInstanceMethod(self, @selector(upgradedViewWillAppear:));
    method_exchangeImplementations(viewWillAppear, upgradedViewWillAppear);
    }
    #pragma mark - Implementation
    - (void)upgradedViewWillAppear:(BOOL)animated
    {
    //
    // Call the original message (it may be a little confusing that we're
    // calling the 'same' method, but we're actually calling the original one :) )
    //
    [self upgradedViewWillAppear:animated];
    //
    // Implementation
    //
    if ([self conformsToProtocol:@protocol(AGViewControllerAppearance)])
    {
    UIViewController <AGViewControllerAppearance> *viewControllerConformingToAppearance =
    (UIViewController <AGViewControllerAppearance> *)self;
    //
    // Status bar
    //
    if ([viewControllerConformingToAppearance respondsToSelector:@selector(preferredStatusBarStyle)])
    {
    BOOL shouldAnimate = YES;
    if ([viewControllerConformingToAppearance respondsToSelector:@selector(animatesStatusBarVisibility)])
    {
    shouldAnimate = [viewControllerConformingToAppearance animatesStatusBarVisibility];
    }
    [[UIApplication sharedApplication] setStatusBarStyle:[viewControllerConformingToAppearance preferredStatusBarStyle]
    animated:shouldAnimate];
    }
    if ([viewControllerConformingToAppearance respondsToSelector:@selector(showsStatusBar)])
    {
    UIStatusBarAnimation animation = UIStatusBarAnimationSlide;
    if ([viewControllerConformingToAppearance respondsToSelector:@selector(prefferedStatusBarAnimation)])
    {
    animation = [viewControllerConformingToAppearance prefferedStatusBarAnimation];
    }
    [[UIApplication sharedApplication] setStatusBarHidden:(! [viewControllerConformingToAppearance showsStatusBar])
    withAnimation:animation];
    }
    }
    }
    @end

    Ahora, es el momento de decir que eres controlador de vista es la aplicación de la AGViewControllerAppearance protocolo.

    Ejemplo:

    @interface XYSampleViewController () <AGViewControllerAppearance>
    ... the rest of the interface
    @end

    Por supuesto, usted puede implementar el resto de los métodos (showsStatusBar, animatesStatusBarVisibility, prefferedStatusBarAnimation) del protocolo y el UIViewController+Actualización va a hacer lo correcto
    personalización basada en los valores proporcionados por ellos.

  17. 0

    Si alguien con este problema con UISearchController.
    Acaba de crear una nueva subclase de UISearchController y, a continuación, agregue el código siguiente a la clase:

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
    }
  18. 0

    Tenga en cuenta que cuando se utiliza el self.navigationController.navigationBar.barStyle = UIBarStyleBlack; solución

    asegúrese de ir a su plist y en «controlador de Vista basado en la apariencia de la barra de estado» en SÍ. Si NO, no funcionará.

    • Configuración de UIViewControllerBasedStatusBarAppearance para SÍ en el proyecto plist hizo toda la diferencia para mí. Me había olvidado de ella.
  19. 0

    La mayoría de las respuestas no son una buena implementación de childViewControllerForStatusBarStyle método para UINavigationController. De acuerdo a mi experiencia que debe manejar casos tales como cuando transparente a la vista controlador se presentan a lo largo de la navegación del controlador. En estos casos, usted debe ceder el control a tu modal (controlador devisibleViewController), pero no cuando está desapareciendo.

    override var childViewControllerForStatusBarStyle: UIViewController? {
    var childViewController = visibleViewController
    if let controller = childViewController, controller.isBeingDismissed {
    childViewController = topViewController
    }
    return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
    }

Dejar respuesta

Please enter your comment!
Please enter your name here