J'utilise une vue Sélecteur pour permettre à l'utilisateur de choisir le thème de couleur pour l'application entière. Je prévois de changer la couleur de la barre de navigation, de l’arrière-plan et éventuellement de la barre d’onglet (si cela est possible). J'ai cherché comment faire cela, mais je n'ai trouvé aucun exemple Swift. Quelqu'un pourrait-il me donner un exemple du code que je devrais utiliser pour modifier la couleur de la barre de navigation et la couleur du texte de la barre de navigation? (La vue Sélecteur est configurée, je cherche simplement le code pour changer les couleurs de l'interface utilisateur)
Merci.
Barre de navigation:
navigationController?.navigationBar.barTintColor = UIColor.green
Remplacez greenColor par l’UIColor de votre choix. Vous pouvez aussi utiliser un RVB si vous préférez.
Texte de la barre de navigation:
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.orange]
Remplacez orangeColor par la couleur de votre choix.
Barre d'onglets:
tabBarController?.tabBar.barTintColor = UIColor.brown
Texte de la barre d'onglets:
tabBarController?.tabBar.tintColor = UIColor.yellow
Sur les deux derniers, remplacez brownColor et yellowColor par la couleur de votre choix.
Voici quelques personnalisations d’apparences très simples que vous pouvez appliquer à l’application large:
UINavigationBar.appearance().backgroundColor = UIColor.greenColor()
UIBarButtonItem.appearance().tintColor = UIColor.magentaColor()
//Since iOS 7.0 UITextAttributeTextColor was replaced by NSForegroundColorAttributeName
UINavigationBar.appearance().titleTextAttributes = [UITextAttributeTextColor: UIColor.blueColor()]
UITabBar.appearance().backgroundColor = UIColor.yellowColor();
En savoir plus sur UIAppearance
API dans Swift, vous pouvez le lire ici: https://developer.Apple.com/documentation/uikit/uiappearance
UINavigationBar.appearance().barTintColor = UIColor(red: 46.0/255.0, green: 14.0/255.0, blue: 74.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]
Collez simplement cette ligne dans didFinishLaunchingWithOptions
dans votre code.
Mis à jour pour Swift 3, 4 & 4.2
// setup navBar.....
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
Swift 4
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
Swift 4.2
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
Vous pouvez également vérifier ici: https://github.com/hasnine/iOSUtilitiesSource
Dans AppDelegate, cela a globalement changé le format de la barre de navigation et supprime la ligne de fond/bordure (qui est un problème pour la plupart des gens) pour vous donner ce que je pense que vous et d'autres recherchent:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barTintColor = Style.SELECTED_COLOR
UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().clipsToBounds = false
UINavigationBar.appearance().backgroundColor = Style.SELECTED_COLOR
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }
Ensuite, vous pouvez configurer un fichier Constants.Swift, contenant une structure Style avec des couleurs, des polices, etc. Vous pouvez ensuite ajouter une tableView/pickerView à tout ViewController et utiliser le tableau "availableThemes" pour permettre à l'utilisateur de changer le themeColor.
La belle chose à propos de cela est que vous pouvez utiliser une référence dans toute votre application pour chaque couleur. Elle se mettra à jour en fonction du "Thème" sélectionné par l'utilisateur. Sans cette valeur, la valeur par défaut est theme1 ():
import Foundation
import UIKit
struct Style {
static let availableThemes = ["Theme 1","Theme 2","Theme 3"]
static func loadTheme(){
let defaults = NSUserDefaults.standardUserDefaults()
if let name = defaults.stringForKey("Theme"){
// Select the Theme
if name == availableThemes[0] { theme1() }
if name == availableThemes[1] { theme2() }
if name == availableThemes[2] { theme3() }
}else{
defaults.setObject(availableThemes[0], forKey: "Theme")
theme1()
}
}
// Colors specific to theme - can include multiple colours here for each one
static func theme1(){
static var SELECTED_COLOR = UIColor(red:70/255, green: 38/255, blue: 92/255, alpha: 1) }
static func theme2(){
static var SELECTED_COLOR = UIColor(red:255/255, green: 255/255, blue: 255/255, alpha: 1) }
static func theme3(){
static var SELECTED_COLOR = UIColor(red:90/255, green: 50/255, blue: 120/255, alpha: 1) } ...
Pour ce faire sur le storyboard (interface Builder Inspector)
Avec l'aide de IBDesignable
, nous pouvons ajouter d'autres options à l'Inspecteur Builder d'Interface pour UINavigationController
et les ajuster sur le scénarimage. Tout d’abord, ajoutez le code suivant à votre projet.
@IBDesignable extension UINavigationController {
@IBInspectable var barTintColor: UIColor? {
set {
guard let uiColor = newValue else { return }
navigationBar.barTintColor = uiColor
}
get {
guard let color = navigationBar.barTintColor else { return nil }
return color
}
}
}
Il vous suffit ensuite de définir les attributs du contrôleur de navigation sur le storyboard.
Cette approche peut également être utilisée pour gérer la couleur du texte de la barre de navigation à partir du storyboard:
@IBInspectable var barTextColor: UIColor? {
set {
guard let uiColor = newValue else {return}
navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: uiColor]
}
get {
guard let textAttributes = navigationBar.titleTextAttributes else { return nil }
return textAttributes[NSAttributedStringKey.foregroundColor] as? UIColor
}
}
UINavigationBar.appearance().barTintColor
a travaillé pour moi
Swift 4:
Code fonctionnant parfaitement pour modifier l'apparence de la barre de navigation au niveau de l'application.
// MARK: Navigation Bar Customisation
// To change background colour.
UINavigationBar.appearance().barTintColor = .init(red: 23.0/255, green: 197.0/255, blue: 157.0/255, alpha: 1.0)
// To change colour of tappable items.
UINavigationBar.appearance().tintColor = .white
// To apply textAttributes to title i.e. colour, font etc.
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white,
.font : UIFont.init(name: "AvenirNext-DemiBold", size: 22.0)!]
// To control navigation bar's translucency.
UINavigationBar.appearance().isTranslucent = false
Bon codage!
Swift 4 - Transition douce (meilleure solution):
Si vous revenez d'un contrôleur de navigation et que vous devez définir une couleur différente sur le contrôleur de navigation utilisé, vous souhaitez utiliser
override func willMove(toParentViewController parent: UIViewController?) {
navigationController?.navigationBar.barTintColor = .white
navigationController?.navigationBar.tintColor = Constants.AppColor
}
au lieu de le mettre dans la vueWillAppear afin que la transition soit plus propre.
Swift 4.2
override func willMove(toParent parent: UIViewController?) {
navigationController?.navigationBar.barTintColor = UIColor.black
navigationController?.navigationBar.tintColor = UIColor.black
}
Utilisez l’API d’apparence et la couleur barTintColor.
UINavigationBar.appearance().barTintColor = UIColor.greenColor()
Dans Swift 4
Vous pouvez changer la couleur de la barre de navigation. Il suffit d’utiliser cet extrait de code ci-dessous dans viewDidLoad()
Couleur de la barre de navigation
self.navigationController?.navigationBar.barTintColor = UIColor.white
Couleur du texte de la barre de navigation
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]
Pour Barre de navigation pour les gros titres iOS 11, vous devez utiliser la propriété largeTitleTextAttributes
.
self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]
La fonction apparence () ne fonctionne pas toujours pour moi. Je préfère donc créer un objet CN et modifier ses attributs.
var navBarColor = navigationController!.navigationBar
navBarColor.barTintColor = UIColor(red: 255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 100.0/100.0)
navBarColor.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
Aussi, si vous voulez ajouter une image au lieu d'un texte, cela fonctionne aussi
var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 70, height: 70))
imageView.contentMode = .ScaleAspectFit
var image = UIImage(named: "logo")
imageView.image = image
navigationItem.titleView = imageView
Si vous avez un contrôleur de navigation personnalisé, vous pouvez utiliser l’extrait de code ci-dessus. Donc, dans mon cas, j'ai utilisé les morceaux de code suivants.
Swift 3.0, version XCode 8.1
navigationController.navigationBar.barTintColor = UIColor.green
Texte de la barre de navigation:
navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]
Ce sont des entretiens très utiles.
Mise à jour de Swift 4, iOS 12 et Xcode 1
Il suffit de mettre une ligne à l'intérieur de viewDidLoad()
navigationController?.navigationBar.barTintColor = UIColor.red
iOS 8 (Swift)
let font: UIFont = UIFont(name: "fontName", size: 17)
let color = UIColor.backColor()
self.navigationController?.navigationBar.topItem?.backBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: color], forState: .Normal)
UINavigationBar.appearance().barTintColor = UIColor(colorLiteralRed: 51/255, green: 90/255, blue: 149/255, alpha: 1)
Cela définira la couleur de votre barre de navigation comme celle de la barre Facebook :)
Swift 3 et Swift 4 Compatible Xcode 9
ne meilleure solution pour créer une classe pour les barres de navigation communes
J'ai 5 contrôleurs et chaque titre de contrôleur est changé en couleur orange. Comme chaque contrôleur a 5 contrôleurs de navigation, j'ai donc dû changer chaque couleur, que ce soit d'inspecteur ou de code.
J'ai donc créé une classe au lieu de changer chaque barre de navigation du code que je viens d’affecter à cette classe et cela a fonctionné avec les 5 capacités de réutilisation du code du contrôleur.Vous devez juste assigner cette classe à Each contrôleur et thats it.
import UIKit
class NabigationBar: UINavigationBar {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonFeatures()
}
func commonFeatures() {
self.backgroundColor = UIColor.white;
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor:ColorConstants.orangeTextColor]
}
}
Dans Swift 2
Pour changer de couleur dans la barre de navigation,
navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
Pour changer de couleur dans la barre de navigation,
navigationController?.navigationBar.tintColor = UIColor.blueColor()
ou
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blueColor()]
iOS 10 Swift 3.0
Si cela ne vous dérange pas d'utiliser les frameworks Swift, alors nous INeraida pour changer le fond de navigation comme UIColor
ou HexColor
ou UIImage
et changer le texte du bouton de navigation arrière par programme, change complète la couleur du texte de fond.
Pour UINavigationBar
neraida.navigation.background.color.hexColor("54ad00", isTranslucent: false, viewController: self)
//Change navigation title, backbutton colour
neraida.navigation.foreground.color.uiColor(UIColor.white, viewController: self)
//Change navigation back button title programmatically
neraida.navigation.foreground.backButtonTitle("Custom Title", ViewController: self)
//Apply Background Image to the UINavigationBar
neraida.navigation.background.image("background", Edge: (0,0,0,0), barMetrics: .default, isTranslucent: false, viewController: self)
Swift
Une doublure simple que vous pouvez utiliser dans ViewDidLoad()
//Change Color
self.navigationController?.navigationBar.barTintColor = UIColor.red
//Change Text Color
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
Je devais faire
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barStyle = .Black
UINavigationBar.appearance().backgroundColor = UIColor.blueColor()
sinon la couleur de fond ne changerait pas
Définissez d'abord la propriété isTranslucent de navigationBar sur false pour obtenir la couleur souhaitée. Puis changez la couleur de la barre de navigation comme ceci:
@IBOutlet var NavigationBar: UINavigationBar!
NavigationBar.isTranslucent = false
NavigationBar.barTintColor = UIColor (red: 117/255, green: 23/255, blue: 49/255, alpha: 1.0)
Assurez-vous de définir le État du bouton pour .normal
extension UINavigationBar {
func makeContent(color: UIColor) {
let attributes: [NSAttributedString.Key: Any]? = [.foregroundColor: color]
self.titleTextAttributes = attributes
self.topItem?.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
self.topItem?.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
}
}
P.S iOS 12, Xcode 10.1
Essayez ceci dans AppDelegate:
//MARK:- ~~~~~~~~~~setupApplicationUIAppearance Method
func setupApplicationUIAppearance() {
UIApplication.shared.statusBarView?.backgroundColor = UIColor.clear
var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
UINavigationBar.appearance().barTintColor = UIColor.white
UINavigationBar.appearance().isTranslucent = false
let attributes: [NSAttributedString.Key: AnyObject]
if DeviceType.IS_IPAD{
attributes = [
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: UIFont(name: "HelveticaNeue", size: 30)
] as [NSAttributedString.Key : AnyObject]
}else{
attributes = [
NSAttributedString.Key.foregroundColor: UIColor.white
]
}
UINavigationBar.appearance().titleTextAttributes = attributes
}