J'ai suivi ce fil pour remplacer -preferredStatusBarStyle
, mais il n'est pas appelé. Y a-t-il des options que je peux changer pour l'activer? (J'utilise des XIB dans mon projet.)
J'ai suivi ce fil pour remplacer -preferredStatusBarStyle
, mais il n'est pas appelé. Y a-t-il des options que je peux changer pour l'activer? (J'utilise des XIB dans mon projet.)
Réponses:
J'ai eu le même problème et j'ai compris que cela se produisait parce que je ne configurais pas le contrôleur de vue racine dans ma fenêtre d'application.
Le UIViewController
dans lequel j'avais implémenté le a preferredStatusBarStyle
été utilisé dans un UITabBarController
, qui contrôlait l'apparence des vues à l'écran.
Lorsque j'ai défini le contrôleur de vue racine pour qu'il pointe vers cela UITabBarController
, les modifications de la barre d'état ont commencé à fonctionner correctement, comme prévu (et la preferredStatusBarStyle
méthode était appelée).
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Alternativement, vous pouvez appeler l'une des méthodes suivantes, selon le cas, dans chacun de vos contrôleurs de vue, en fonction de sa couleur d'arrière-plan, au lieu d'avoir à utiliser setNeedsStatusBarAppearanceUpdate
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
ou
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
Notez que vous aurez également besoin de jeu UIViewControllerBasedStatusBarAppearance
pour NO
dans le fichier plist si vous utilisez cette méthode.
setNeedsStatusBarAppearanceUpdate
- mes soupçons ont été confirmés lorsque j'ai apporté ce changement.
Pour toute personne utilisant un UINavigationController:
Le UINavigationController
ne transfère pas les preferredStatusBarStyle
appels à ses contrôleurs de vue enfant. Au lieu de cela, il gère son propre état - comme il se doit, il dessine en haut de l'écran où se trouve la barre d'état et devrait donc en être responsable. Par conséquent, l'implémentation preferredStatusBarStyle
dans vos VC au sein d'un contrôleur de navigation ne fera rien - ils ne seront jamais appelés.
L'astuce consiste UINavigationController
à savoir à quoi sert pour décider quoi retourner UIStatusBarStyleDefault
ou UIStatusBarStyleLightContent
. Il base cela sur son UINavigationBar.barStyle
. La valeur par défaut ( UIBarStyleDefault
) entraîne la UIStatusBarStyleDefault
barre d'état de premier plan sombre . Et UIBarStyleBlack
donnera une UIStatusBarStyleLightContent
barre d'état.
TL; DR:
Si vous voulez UIStatusBarStyleLightContent
sur une UINavigationController
utilisation:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
preferredStatusBarStyle
sera en fait appelé sur le contrôleur de vue enfant si vous masquez la barre de navigation (définie navigationBarHidden
sur YES
), exactement comme il convient.
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
set to YES
aura effectivement preferredStatusBarStyle
appelé, et un avertissement à ceux qui pourraient tomber dessus: cela fonctionne avec navigationBarHidden
, mais pas avec navigationBar.hidden
!
J'ai donc ajouté une catégorie à UINavigationController mais j'ai utilisé les méthodes:
-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;
et que ceux-ci renvoient le UIViewController visible actuel. Cela permet au contrôleur de vue visible actuel de définir son propre style / visibilité préféré.
Voici un extrait de code complet pour cela:
Dans Swift:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
}
Dans l'objectif-C:
@interface UINavigationController (StatusBarStyle)
@end
@implementation UINavigationController (StatusBarStyle)
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
@end
Et pour faire bonne mesure, voici comment il est ensuite implémenté dans un UIViewController:
Dans Swift
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func prefersStatusBarHidden() -> Bool {
return false
}
Dans Objective-C
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style
}
- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code
}
Enfin, assurez-vous que le plist de votre application n'a PAS "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur NON. Supprimez cette ligne ou définissez-la sur OUI (qui, je crois, est la valeur par défaut maintenant pour iOS 7?)
return self.topViewController;
marche pour moi, mais return self.visibleViewController;
- pas
super
cette méthode et vous voulez réellement changer le comportement de tous les contrôleurs de ce type
Pour tous ceux qui luttent toujours avec cela, cette simple extension dans swift devrait résoudre le problème pour vous.
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
Mon application utilise trois: UINavigationController
, UISplitViewController
, UITabBarController
, ceux - ci semblent tout ainsi prendre le contrôle de la barre d'état et causeront preferedStatusBarStyle
de ne pas être appelé pour leurs enfants. Pour remplacer ce comportement, vous pouvez créer une extension comme le reste des réponses l'ont mentionné. Voici une extension pour les trois, dans Swift 4. J'aimerais qu'Apple soit plus clair sur ce genre de choses.
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
}
}
Edit: mise à jour pour les modifications de l'API Swift 4.2
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
}
}
La réponse de Tyson est correcte pour changer la couleur de la barre d'état en blanc dans UINavigationController
.
Si quelqu'un veut obtenir le même résultat en écrivant le code, AppDelegate
utilisez le code ci-dessous et écrivez-le dans la AppDelegate's
didFinishLaunchingWithOptions
méthode.
Et ne pas oublier de mettre l' UIViewControllerBasedStatusBarAppearance
au YES
dans le fichier .plist, sinon le changement ne reflètent pas nécessairement.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// status bar appearance code
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
return YES;
}
Sur un UINavigationController, preferredStatusBarStyle
n'est pas appelé car il topViewController
est préférable de le faire self
. Donc, pour être preferredStatusBarStyle
appelé sur un UINavigationController, vous devez changer son childViewControllerForStatusBarStyle
.
Remplacez votre UINavigationController dans votre classe:
class MyRootNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Pour le faire pour tous les UINavigationController, vous pouvez remplacer une extension (avertissement: cela affecte UIDocumentPickerViewController, UIImagePickerController, etc.), mais vous ne devriez probablement pas le faire selon la documentation Swift :
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
En plus de la réponse de Serenn, si vous présentez un contrôleur de vue avec un modalPresentationStyle
(par exemple .overCurrentContext
), vous devez également appeler cela sur le contrôleur de vue nouvellement présenté:
presentedViewController.modalPresentationCapturesStatusBarAppearance = true
N'oubliez pas de remplacer également le preferredStatusBarStyle
dans le contrôleur de vue présenté.
Un ajout à la réponse d'Hippo: si vous utilisez un UINavigationController, il est probablement préférable d'ajouter une catégorie:
// 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
Cette solution est probablement meilleure que de passer à un comportement bientôt obsolète.
preferredStatusBarStyle
et fait la logique spécifique UINavigationController. À l'heure actuelle, cette logique est basée sur, navigationBar.barStyle
mais je peux voir des vérifications supplémentaires ajoutées (par exemple, UISearchDisplayController
passer au mode masquer la barre de navigation). En remplaçant la logique par défaut, vous perdez toutes ces fonctionnalités et vous laissez ouvert pour les moments gênants «wtf» à l'avenir. Voir ma réponse ci-dessus pour la bonne façon de le faire tout en prenant en charge le comportement du contrôleur de navigation intégré.
Comme mentionné dans la réponse sélectionnée , la cause principale est de vérifier votre objet contrôleur de vue racine de fenêtre.
childForStatusBarStyle
Utilisez les extensions suivantes, il gère tous les scénarios ci-dessus -
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
}
}
UIViewControllerBasedStatusBarAppearance
saisir la clé info.plist
car c'est vrai par défautSi vous présentez un nouveau flux de manière modale, il se détache du flux de style de barre d'état existant. Supposons donc que vous présentiez un NewFlowUIViewController
, puis ajoutez un nouveau contrôleur de navigation ou tabBar à NewFlowUIViewController
, puis ajoutez l'extension de NewFlowUIViewController
ainsi pour gérer davantage le style de la barre d'état du contrôleur.
Si vous définissez modalPresentationStyle autrement que fullScreen
lors de la présentation modale, vous devez définir modalPresentationCapturesStatusBarAppearance
true pour que le contrôleur de vue présenté reçoive le contrôle d'apparence de la barre d'état.
UINavigationController
est une sous-classe de UIViewController
(qui savait 🙃)!
Par conséquent, lorsque vous présentez des contrôleurs de vue intégrés dans les contrôleurs de navigation, vous ne présentez pas vraiment les contrôleurs de vue intégrés; vous présentez les contrôleurs de navigation! UINavigationController
, en tant que sous-classe de UIViewController
, hérite de preferredStatusBarStyle
et childForStatusBarStyle
que vous pouvez définir à votre guise.
L'une des méthodes suivantes devrait fonctionner:
info.plist
, ajoutez la propriété suivante:
UIUserInterfaceStyle
(alias "Style d'interface utilisateur")Remplacer à l' preferredStatusBarStyle
intérieurUINavigationController
preferredStatusBarStyle
( doc ) - Le style de barre d'état préféré pour le contrôleur de vueSous-classe ou extension UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
OU
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
Remplacer à l' childForStatusBarStyle
intérieurUINavigationController
childForStatusBarStyle
( doc ) - Appelé lorsque le système a besoin du contrôleur de vue à utiliser pour déterminer le style de la barre d'état"Si votre contrôleur de vue de conteneur dérive son style de barre d'état de l'un de ses contrôleurs de vue enfant, [remplacez cette propriété] et renvoyez ce contrôleur de vue enfant. Si vous retournez nil ou ne remplacez pas cette méthode, le style de barre d'état pour self est utilisé . Si la valeur de retour de cette méthode change, appelez la méthode setNeedsStatusBarAppearanceUpdate (). "
Sous-classe ou extension UINavigationController
class MyNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
OU
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
Vous pouvez retourner n'importe quel contrôleur de vue que vous souhaitez ci-dessus. Je recommande l'une des options suivantes:
topViewController
(of UINavigationController
) ( doc ) - Le contrôleur de vue en haut de la pile de navigationvisibleViewController
(of UINavigationController
) ( doc ) - Le contrôleur de vue associé à la vue actuellement visible dans l'interface de navigation (indice: cela peut inclure "un contrôleur de vue qui a été présenté de façon modale au-dessus du contrôleur de navigation lui-même")Remarque: Si vous décidez de sous UINavigationController
- classe , n'oubliez pas d'appliquer cette classe à vos contrôleurs de navigation via l'inspecteur d'identité dans IB.
PS Mon code utilise la syntaxe Swift 5.1 😎
La réponse de @ serenn ci-dessus est toujours excellente pour le cas de UINavigationControllers. Cependant, pour swift 3, les fonctions childViewController ont été remplacées par vars
. Le UINavigationController
code d'extension doit donc être:
override open var childViewControllerForStatusBarStyle: UIViewController? {
return topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return topViewController
}
Et puis dans le contrôleur de vue qui devrait dicter le style de la barre d'état:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Si votre viewController est sous UINavigationController.
Sous-classe UINavigationController et ajouter
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
ViewController preferredStatusBarStyle
sera appelé.
UIStatusBarStyle dans iOS 7
La barre d'état dans iOS 7 est transparente, la vue derrière elle transparaît.
Le style de la barre d'état fait référence à l'apparence de son contenu. Dans iOS 7, le contenu de la barre d'état est sombre ( UIStatusBarStyleDefault
) ou clair ( UIStatusBarStyleLightContent
). Les deux UIStatusBarStyleBlackTranslucent
et UIStatusBarStyleBlackOpaque
sont déconseillés dans iOS 7.0. UtilisationUIStatusBarStyleLightContent
plutôt.
Comment changer UIStatusBarStyle
Si sous la barre d'état se trouve une barre de navigation, le style de la barre d'état sera ajusté pour correspondre au style de la barre de navigation (UINavigationBar.barStyle
):
Plus précisément, si le style de barre de navigation est UIBarStyleDefault, le style de barre d'état sera UIStatusBarStyleDefault
; si le style de barre de navigation est UIBarStyleBlack
, le style de barre d'état seraUIStatusBarStyleLightContent
.
S'il n'y a pas de barre de navigation sous la barre d'état, le style de la barre d'état peut être contrôlé et modifié par un contrôleur de vue individuel pendant l'exécution de l'application.
- [UIViewController preferredStatusBarStyle]
est une nouvelle méthode ajoutée dans iOS 7. Il peut être remplacé pour renvoyer le style de barre d'état préféré:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Si le style de la barre d'état doit être contrôlé par un contrôleur de vue enfant au lieu de soi, remplacez -[UIViewController childViewControllerForStatusBarStyle]
pour renvoyer ce contrôleur de vue enfant.
Si vous préférez désactiver ce comportement et définir le style de la barre d'état à l'aide de la -[UIApplication statusBarStyle]
méthode, ajoutez la UIViewControllerBasedStatusBarAppearance
clé au Info.plist
fichier d' une application et donnez-lui la valeur NO.
Si quelqu'un utilise un contrôleur de navigation et souhaite que tous ses contrôleurs de navigation aient le style noir, vous pouvez écrire une extension à UINavigationController comme celle-ci dans Swift 3 et elle s'appliquera à tous les contrôleurs de navigation (au lieu de l'assigner à un contrôleur à un temps).
extension UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.barStyle = UIBarStyle.black
}
}
Dans Swift pour tout type de UIViewController:
Dans votre AppDelegate
set:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window!.rootViewController = myRootController
return true
}
myRootController
peut être tout type de UIViewController
, par exemple UITabBarController
ou UINavigationController
.
Ensuite, remplacez ce contrôleur racine comme ceci:
class RootController: UIViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
Cela changera l'apparence de la barre d'état dans l'ensemble de votre application, car le contrôleur racine est seul responsable de l'apparence de la barre d'état.
N'oubliez pas de définir la propriété View controller-based status bar appearance
sur YES dans votre Info.plist
pour que cela fonctionne (ce qui est la valeur par défaut).
La plupart des réponses n'incluent pas une bonne implémentation de la childViewControllerForStatusBarStyle
méthode pour UINavigationController
. Selon mon expérience, vous devez gérer des cas tels que lorsque le contrôleur de vue transparent est présenté sur le contrôleur de navigation. Dans ces cas, vous devez passer le contrôle à votre contrôleur modal ( visibleViewController
), mais pas lorsqu'il disparaît.
override var childViewControllerForStatusBarStyle: UIViewController? {
var childViewController = visibleViewController
if let controller = childViewController, controller.isBeingDismissed {
childViewController = topViewController
}
return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}
Quant à iOS 13.4, la preferredStatusBarStyle
méthode dans la UINavigationController
catégorie ne sera pas appelée, le swizzling semble être la seule option sans avoir besoin d'utiliser une sous-classe.
Exemple:
En-tête de catégorie:
@interface UINavigationController (StatusBarStyle)
+ (void)setUseLightStatusBarStyle;
@end
La mise en oeuvre:
#import "UINavigationController+StatusBarStyle.h"
#import <objc/runtime.h>
@implementation UINavigationController (StatusBarStyle)
void (^swizzle)(Class, SEL, SEL) = ^(Class c, SEL orig, SEL new){
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
};
+ (void)setUseLightStatusBarStyle {
swizzle(self.class, @selector(preferredStatusBarStyle), @selector(_light_preferredStatusBarStyle));
}
- (UIStatusBarStyle)_light_preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
Utilisation dans AppDelegate.h:
#import "UINavigationController+StatusBarStyle.h"
[UINavigationController setUseLightStatusBarStyle];
Voici ma méthode pour résoudre ce problème.
Définissez un protocole appelé AGViewControllerAppearance .
AGViewControllerAppearance.h
#import <Foundation/Foundation.h>
@protocol AGViewControllerAppearance <NSObject>
@optional
- (BOOL)showsStatusBar;
- (BOOL)animatesStatusBarVisibility;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIStatusBarAnimation)prefferedStatusBarAnimation;
@end
Définissez une catégorie sur UIViewController appelée Upgrade .
UIViewController + Upgrade.h
#import <UIKit/UIKit.h>
@interface UIViewController (Upgrade)
//
// Replacements
//
- (void)upgradedViewWillAppear:(BOOL)animated;
@end
UIViewController + Upgrade.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
Maintenant, il est temps de dire que votre contrôleur de vue implémente le protocole AGViewControllerAppearance .
Exemple:
@interface XYSampleViewController () <AGViewControllerAppearance>
... the rest of the interface
@end
Bien sûr, vous pouvez mettre en œuvre le reste des méthodes ( showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation ) du protocole et UIViewController + Upgrade fera la personnalisation appropriée en fonction des valeurs fournies par eux.
Notez que lorsque vous utilisez le self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
solution
assurez-vous d'aller dans votre liste et de régler "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur OUI. Si ce n'est pas le cas, cela ne fonctionnera pas.
Depuis Xcode 11.4, remplacer le preferredStatusBarStyle
propriété dans une extension UINavigationController ne fonctionne plus car elle ne sera pas appelée.
Réglage du barStyle
de navigationBar
à des .black
œuvres , certes , mais cela va ajouter des effets secondaires indésirables si vous ajoutez subviews à la navigationBar qui peut avoir différentes apparences pour le mode lumière et l' obscurité. Parce qu'en définissant le barStyle
sur noir, la userInterfaceStyle
vue qui est intégrée dans la barre de navigation aura alors toujours userInterfaceStyle.dark
indépendamment userInterfaceStyle
de l'application.
La bonne solution que je trouve est d'ajouter une sous-classe de UINavigationController
et de la remplacer preferredStatusBarStyle
. Si vous utilisez ensuite ce UINavigationController personnalisé pour toutes vos vues, vous serez du côté de la sauvegarde.
Le NavigationController ou TabBarController sont ceux qui doivent fournir le style. Voici comment j'ai résolu: https://stackoverflow.com/a/39072526/242769