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
}
É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.
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 .... !!!
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.
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
}
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)
}
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()]
}
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()
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;
}
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!