En mi aplicación para iPhone construido con Xcode 5 para el sistema iOS 7 I UIViewControllerBasedStatusBarAppearance=YES
en info.plist
, y en mi ViewController
Tengo este código:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Pero la barra de estado sigue siendo negra sobre fondo negro.
Sé que es posible cambiar esta aplicación en todo mediante el establecimiento UIViewControllerBasedStatusBarAppearance=NO
de info.plist
, pero en realidad lo que necesito para alterar esto en un viewController
por viewController
base en tiempo de ejecución.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
fuente
fuente
Respuestas:
Descubrí que si su ViewController está dentro de un navigationController, el navigationController
navigationBar.barStyle
determina el statusBarStyle.Configurar su barra de navegación
barStyle
enUIBarStyleBlackTranslucent
dará un texto de barra de estado blanco (es decirUIStatusBarStyleLightContent
), yUIBarStyleDefault
dará un texto de barra de estado negro (es decirUIStatusBarStyleDefault
).Tenga en cuenta que esto se aplica incluso si cambia totalmente el color de la barra de navegación a través de su
barTintColor
.fuente
UINavigationController
'spreferredStatusBarStyle
no llama al ViewController que aloja, y en su lugar solo regresa basado en su navigationBarStyle.UIBarStyleBlackTranslucent
está obsoleto, utiliceUIBarStyleBlack
en su lugarBien, aquí está el truco. Debe agregar la tecla "Ver barra de estado basada en el controlador" y establecer el valor en No.
Esto va en contra de lo que parece ser el significado de esta clave, pero incluso si establece el valor en
No
, aún puede cambiar la apariencia de la barra de estado y si se muestra o no en cualquier controlador de vista. Así que actúa como "Sí", ¡pero configúrelo en "No"!Ahora puedo poner la barra de estado en blanco u oscuro.
fuente
Para
preferredStatusBarStyle()
trabajar dentroUINavigationController
yUITabBarController
agrego el siguiente código, que obtendrá el estilo de barra de estado preferido del controlador de vista actualmente visible.Para Swift 3 esos no son métodos sino propiedades:
Las propiedades de Swift 4.2 han cambiado de nombre:
Uso
fuente
Puede que llegue a esto un poco tarde, pero en caso de que alguien más esté buscando una solución completa de aplicación verificada y que funcione.
@mxcl tiene razón al describir por qué sucede esto. Para corregirlo, simplemente creamos una extensión (o categoría en obj-c) que anula el método preferidoSatusBarStyle () de UINavigationController. Aquí hay un ejemplo en Swift:
Este código simplemente extrae el primer controlador de vista (el controlador de vista raíz) y lo desenvuelve (en obj-c simplemente verifique que no sea nulo). Si el desenvolvimiento es exitoso (no nulo), entonces tomamos rootViewControllers favoriteStatusBarStyle. De lo contrario, devolvemos el valor predeterminado.
Espero que esto ayude a cualquiera que lo necesite.
fuente
return self.preferredStatusBarStyle()
volvería a llamar en este mismo método exacto.visibleViewController
sería aún mejorPara proporcionar más detalles sobre la respuesta aceptada, coloque la siguiente línea en el
didFinishLaunchingWithOptions:
método del delegado de su aplicación :Luego, en su Info.plist, agréguelo
View controller-based status bar appearance
y configúrelo enNO
.Creo que así es como debe hacerse, NO desde el controlador de navegación, si desea el mismo color de barra de estado para toda la aplicación. Es posible que tenga pantallas que no estén necesariamente incrustadas en una subclase
UINavigationController
diferenteUINavigationController
en otro lugar o en otras cosas.EDITAR : También puede hacerlo sin escribir ningún código: https://stackoverflow.com/a/18732865/855680
fuente
En viewDidLoad solo escribe esto
solo haz eso y funcionará
¿Puedes intentar esto?
Una cosa más que he visto en su pregunta es que ha escrito el método de esta manera.
pero debería ser así
fuente
[self setNeedsStatusBarAppearanceUpdate];
un gran método, ¡gracias!Así es como lo resolví. Por lo general, el navigationController o tabBarController son los que deciden la apariencia de la barra de estado (oculta, color, etc.).
Así que terminé subclasificando el controlador de navegación y anulando favoriteStatusBarStyle. si el ViewContorller visible actual implementa StatusBarStyleHandler, pido que el valor se use como estilo, si no es así, solo devuelvo un valor predeterminado.
La forma en
setNeedsStatusBarAppearanceUpdate
que activa una actualización de la apariencia de la barra de estado es llamando a cuál se activa depreferredStatusBarStyle
nuevo y actualiza la interfaz de usuario de acuerdo con lo que devuelve el método.Entonces uso
fuente
1) Una configuración para todo el proyecto:
Si está disponible, elimine el
UIViewControllerBasedStatusBarAppearance
par clave-valor de su info.plist o configúreloNO
sin eliminarlo. Si no está disponible en su info.plist, no haga nada. El valor predeterminado esNO
para esta propiedad.Agregue el siguiente código a su AppDelegate.m:
2) Diferentes configuraciones para diferentes controladores de vista:
Agregue
UIViewControllerBasedStatusBarAppearance
un par clave-valor a su info.plist y configúrelo enYES
.Si su View Controller no está integrado en Navigation Controller. Digamos MyViewController. simplemente agregue el código a continuación a su archivo MyViewController.m. Si su View Controller está integrado en Navigation Controller, cree una nueva Clase Cocoa Touch y conviértala en una subclase de UINavigationController. Digamos MyNC. Seleccione Vista del controlador de navegación en su Storyboard, en el panel derecho; Utilidades -> Inspector de identidad -> Clase personalizada -> Clase, escriba "MyNC". Después de vincular Storyboard View con su Clase Cocoa Touch "MyNC", agregue el código a continuación a su MyNC.m:
fuente
Incluso con todas las respuestas aquí, todavía no encontré la solución exacta para mí, pero comencé con la respuesta de Daniel. Con lo que terminé fue:
en los controladores de navegación (similar para la pestaña, solo selectedViewController). Y luego respetará:
En cada controlador de vista, a menos que lo establezca de otra manera. No necesito llamar a
setNeedsStatusBarAppearanceUpdate()
ningún lado, solo se actualiza cuando llegas a cada controlador de vista.fuente
Soluciones iOS 13
La respuesta más votada usa código "heredado" 👎
La configuración de la
barStyle
propiedad ahora (iOS 13+) se considera una "personalización heredada". Según Apple ,En cuanto a su intento, ¡estaba en el camino correcto!
UINavigationController
es una subclase deUIViewController
(quién sabía 🙃)!Por lo tanto, al presentar controladores de vista integrados en los controladores de navegación, en realidad no está presentando los controladores de vista integrados; estás presentando los controladores de navegación!
UINavigationController
, como subclase deUIViewController
, heredapreferredStatusBarStyle
ychildForStatusBarStyle
, que puede establecer como desee.Cualquiera de los siguientes métodos debería funcionar:
Anular
preferredStatusBarStyle
dentroUINavigationController
preferredStatusBarStyle
( doc ): el estilo de barra de estado preferido para el controlador de vistaSubclase o extender
UINavigationController
O
Anular
childForStatusBarStyle
dentroUINavigationController
childForStatusBarStyle
( doc ): se llama cuando el sistema necesita que el controlador de vista se use para determinar el estilo de la barra de estadoSubclase o extender
UINavigationController
O
Puede devolver cualquier controlador de vista que desee arriba. Recomiendo uno de los siguientes:
topViewController
(ofUINavigationController
) ( doc ): el controlador de vista en la parte superior de la pila de navegaciónvisibleViewController
(ofUINavigationController
) ( doc ): el controlador de vista asociado con la vista actualmente visible en la interfaz de navegación (pista: esto puede incluir "un controlador de vista que se presentó de forma modal en la parte superior del controlador de navegación")Nota: Si decide crear una subclase
UINavigationController
, recuerde aplicar esa clase a sus controladores de navegación a través del inspector de identidad en IB.PD Mi código usa la sintaxis Swift 5.1 😎
fuente
.default
estilo tiene en cuenta el modo oscuro y no está documentado, por lo que si también es compatible con versiones anteriores de iOS, puede agregarloif #available(iOS 13, *) { return .darkContent } else { return .default }
si intenta configurar el estilo de la barra de estado manualmente de acuerdo con el color detrás de la barra de estado y ese color es "brillante".Si en caso de que quisiera ocultar la barra de estado durante la pantalla de presentación, pero quisiera cambiar el estilo a contenido ligero (StatusBarInitiallyHidden en Plist tiene que ser NO para ocultar barra de estado en la presentación), puede agregar esto al método didFinishLaunchingWithOptions de appDelegate para cambiar a lightContent.
fuente
ejemplo rápido
en AppDelegate.swift
en info.plist set Ver la apariencia de la barra de estado basada en el controlador: NO
fuente
Si está usando
NavigationController
, puede crear una subclaseNavigationController
para que consulte su controlador de vista secundario// MyCustomNavigationController
fuente
Rápido 4.2
fuente
Puede configurar el estilo de la barra de estado. Se parecerá a la barra de estado como IOS 6 e inferior.
Pegue estos métodos en su controlador de vista
y llamar a este método desde la vista se cargó así
fuente
[self setStatusBarNeedsUpdate]
al segundo bloque? (O algo más al menos).Solo quiero agregar una nota para un caso específico que enfrenté. Tenía otra UIWindow en mi aplicación para mostrar una cara de chat que flotaba por toda mi aplicación todo el tiempo. Hacer esto hizo que ninguna de las soluciones anteriores funcionara, ¡y no estoy realmente seguro de por qué! ¡Todo lo que he notado es que mi ViewController en la nueva UIWindow fue la razón de eso! Y si quisiera cambiar el estilo de la barra de estado, tengo que hacerlo en ese controlador de vista de la nueva UIWindow.
¡Esta nota podría ayudar a otros que tienen una estructura similar! Entonces, básicamente, puede aplicar las soluciones mencionadas anteriormente en el ViewController de la nueva UIWindow.
Nuevamente este es un caso específico.
Gracias
fuente
Para swift 3, en su UIViewController:
fuente