web-dev-qa-db-fra.com

la couleur d'arrière-plan de la barre d'état personnalisée iOS ne s'affiche pas

J'essaie de remplir la couleur d'arrière-plan de la barre d'état en orange à l'aide des éléments suivants

UINavigationBar.appearance().tintColor = UIColor.orangeColor()
UINavigationBar.appearance().barTintColor = UIColor.orangeColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

Cependant, je reçois une barre d'état blanche qui devrait être remplie en orange au lieu de suivre cet exemple: Personnaliser l'apparence de la barre de navigation avec Swift

Je suis en train de l'installer dans le fichier AppDelegate.Swift sous la méthode didFinishLaunchingWithOptions pour l'appliquer à l'ensemble de l'application. 

J'ai modifié mon info.plist comme suit: View controller-based status bar appearance => NO 

Est-ce que quelqu'un sait ce que je fais mal?

Edit: Je ne suis pas sûr que ce soit important, mais la vue est dans un UITabBarController 

Edit 2: Cela se produit actuellement dans toutes les vues, pas seulement dans UITabBarController.

Edit 3: Merci @Utsav Parikh 

J'ajoute maintenant une vue en haut de la barre d'état et celle-ci est brève pendant le chargement de l'application. La barre d'état est orange, mais une fois le chargement terminé, il est déplacé hors de la vue et remplacé par la barre d'état générique blanche. Pourquoi cela arriverait-il?

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window!.rootViewController!.view.addSubview(view) 

Éditer pour Swift 3:

avec UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Sans contrôleurs intégrés

Je me rends compte que certaines personnes viennent ici non seulement pour la barre d'état, mais en fait pour la barre de navigation. J'ai donc appris quelques astuces pour le faire sans aucun contrôleur intégré:

Ajoutez cette méthode dans votre AppDelegate.Swift et appelez-la dans le didFinishLaunchingWithOptions

func customizeAppearance() {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor
}
15
Simon

Éditer pour Swift 3 :

Avec UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Sans contrôleurs intégrés

Je me rends compte que certaines personnes viennent ici non seulement pour la barre d'état, mais en fait pour la barre de navigation, alors j'ai appris quelques astuces pour le faire sans aucun contrôleur intégré:

Ajoutez cette méthode dans votre AppDelegate.Swift et appelez-la dans le didFinishLaunchingWithOptions

func customizeAppearance() {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor
}

Grâce à @Utsav, j'ai ajouté la sous-vue suivante à mon UITabBarController et cela semble fonctionner maintenant: 

    let view = UIView(frame:
                    CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0)
                )
    view.backgroundColor = UIColor.orangeColor()

    self.view.addSubview(view)

Le UITabBarController ne semble pas bien jouer dans AppDelegate . Si quelqu'un a un meilleur moyen de le faire, faites le moi savoir, mais pour l'instant c'est la solution à laquelle je suis venu.

26
Simon

Ajouter ce code dans didFinishLaunchingWithOptions in AppDelegate

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window.rootViewController.view.addSubview(view)

J'espère que ça vous aide .... !!!

16
Utsav Parikh

Voici comment je l'ai fait sans ajouter de vue dans un VC avec dans un NavBarController

Je voulais que la couleur de la barre d'état soit la même que celle de la vue VC. Je viens d'écrire:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.grayColor()
    self.navigationController?.navigationBar.clipsToBounds = true
}

Essayez-le.

6
naz

La réponse de Simon dans Swift 3

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Il existe un autre moyen de savoir qui utilise une API privée. Cela présente des avantages lorsque l'orientation change et que le clavier est présenté et que la vue se déplace vers le haut. Je l'ai utilisé et j'ai eu de la chance à chaque fois (l'application a été publiée dans l'App Store).

func setStatusBarBackgroundColor(color: UIColor) {

    guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return }

    statusBar.backgroundColor = color
} 
1
Warif Akhand Rishi

Après ce que vous avez fait dans info.plist à ce qui suit: View controller-based status bar appearance => NO.

Ajoutez ce code dans le fichier AppDelegate.Swift sous didFinishLaunchingWithOptions:

var navigationBarAppearace = UINavigationBar.appearance()

navigationBarAppearace.tintColor = uicolorFromHex(0xffffff)
navigationBarAppearace.barTintColor = uicolorFromHex(0x2E9AFE)

// change navigation item title color
navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

et vous pouvez sélectionner n’importe quel code hexadécimal pour choisir votre couleur .. !! Prendre plaisir..!!

Désolé, j'ai oublié d'utiliser hexcode, vous en aurez besoin aussi, alors ajoutez ce code n'importe où dans votre AppDelegate.Swift:

func uicolorFromHex(rgbValue:UInt32)->UIColor {

    let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0

    let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0

    let blue = CGFloat(rgbValue & 0xFF)/256.0

    return UIColor(red:red, green:green, blue:blue, alpha:1.0)
}
1
Irshad Qureshi

Je pense que votre dernière ligne annule vos modifications, essayez ceci:

override func viewWillAppear(animated: Bool) {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
        super.viewWillAppear(animated)
        var nav = self.navigationController?.navigationBar
        nav?.barStyle = UIBarStyle.Black
        nav?.tintColor = UIColor.orangeColor()
        nav?.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
    }
1
Icaro

UINavigationBar.appereance() fonctionne pour les prochains viewControllers, mais pas pour le rootViewController actuellement affiché. Pour ce faire, j'ai ajouté ce qui suit à ma didFinishLaunchingWithOptions:

UINavigationBar.appearance().tintColor = myColor

let navigationController = UIApplication.sharedApplication().windows[0].rootViewController as! UINavigationController
navigationController.navigationBar.barTintColor = myColor
navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : myTextColor]
navigationController.navigationBar.translucent = false

navigationController.setNeedsStatusBarAppearanceUpdate()
0
zisoft

Il existe une différence principale entre tintColor et le changement de la couleur de fond de UINavigationBar. La meilleure façon, à mon avis, est d’appliquer une image d’arrière-plan, constituée d’une image de 1 pixel carré d’une seule couleur.
Comme ça:

let tabbarAndNavBarBkg = UIImage(named: "nav_tab")
UINavigationBar.appearance().setBackgroundImage(tabbarAndNavBarBkg, forBarMetrics: .Default) 

Ou vous pouvez créer une catégorie sur UIColor pour renvoyer une UIImage étant donné une instance UIColor, dans objC:

+ (UIImage *) imageWithColor:(UIColor*) color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return colorImage;
}
0
Andrea

Swift 3:

Dans votre fichier AppDelegate.Swift, collez le code ci-dessous dans votre méthode didFinishLaunchingWithOptions :

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = UIColor(red: 255/255, green: 130/255, blue: 0/255, alpha: 1.0) // Organge colour in RGB
self.window?.rootViewController?.view.addSubview(view)

Cela fonctionne bien pour moi!

0
Bruno Campos