Environnement: - Xcode 6 beta 4 - Swift language - Application à onglets iOS (projet xCode par défaut)
Comment puis-je changer la couleur grise par défaut des onglets en autre chose? (De préférence à l'échelle mondiale)
En ce qui concerne mes recherches, je dois en quelque sorte changer le mode de rendu d'image pour chaque onglet en mode de rendu original mais je ne sais pas comment
Chaque élément (par défaut) de la barre d'onglets se compose de texte et d'icône. Il est assez facile de changer les couleurs du texte globalement en spécifiant l'apparence:
// you can add this code to you AppDelegate application:didFinishLaunchingWithOptions:
// or add it to viewDidLoad method of your TabBarController class
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.magentaColor()], forState:.Normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState:.Selected)
Avec les images, la situation est un peu plus compliquée. Vous ne pouvez pas définir leur apparence globalement. Vous devez les redéfinir dans votre classe TabBarController. Ajoutez le code ci-dessous à la méthode viewDidLoad
de votre classe TabBarController
:
for item in self.tabBar.items as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
}
Comme nous le savons, il n'y a pas de méthode imageWithColor(...)
dans la classe UIImage. Voici donc l'implémentation de l'extension:
// Add anywhere in your app
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext() as CGContextRef
CGContextTranslateCTM(context, 0, self.size.height)
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, .Normal)
let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
CGContextClipToMask(context, rect, self.CGImage)
tintColor.setFill()
CGContextFillRect(context, rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
UIGraphicsEndImageContext()
return newImage
}
}
imageWithColor
a été emprunté à cette réponse: https://stackoverflow.com/a/24545102/3050466
Je n'ai pas assez de réputation pour commenter les commentaires, mais beaucoup se demandent comment changer la couleur de image sélectionnée
ajoutez simplement un autre if let
vérifier après
if let image = item.image
juste comme ça:
if let selectedImage = item.selectedImage {
item.selectedImage = selectedImage.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
cela a parfaitement résolu le problème. Et un petit ajout, puisque Swift 1.2 et Xcode 6.3.2 dont vous avez besoin
for item in self.tabBar.items as! [UITabBarItem]
au lieu de
for item in self.tabBar.items as [UITabBarItem]
J'espère que cela pourra aider!
Swift 2.
Pour modifier la couleur par défaut des images de la barre d'onglets, ajoutez le code ci-dessous à la méthode viewDidLoad
de votre classe TabBarController
:
for item in self.tabBar.items! as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(UIColor.yellowColor()).imageWithRenderingMode(.AlwaysOriginal)
}
}
Mettez à jour l'extension imageWithColor
. Utilisé avec la méthode ci-dessus et doit être placé en dehors de votre classe TabBarController
:
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext()! as CGContextRef
CGContextTranslateCTM(context, 0, self.size.height)
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, CGBlendMode.Normal)
let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
CGContextClipToMask(context, rect, self.CGImage)
tintColor.setFill()
CGContextFillRect(context, rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
UIGraphicsEndImageContext()
return newImage
}
}
Aucune modification de la façon dont le texte est coloré, mais uniquement à titre de référence. Il faut également ajouter le code ci-dessous à viewDidLoad
:
// you can add this code to you AppDelegate application:didFinishLaunchingWithOptions:
// or add it to viewDidLoad method of your TabBarController class
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.magentaColor()], forState:.Normal)
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState:.Selected)
Swift 3.
Pour modifier la couleur par défaut des images de la barre d'onglets, ajoutez le code ci-dessous à la méthode viewDidLoad
de votre classe TabBarController
:
for item in self.tabBar.items! as [UITabBarItem] {
if let image = item.image {
item.image = image.imageWithColor(tintColor: UIColor.yellow).withRenderingMode(.alwaysOriginal)
}
}
Mettez à jour l'extension imageWithColor
. Utilisé avec la méthode ci-dessus et doit être placé en dehors de votre classe TabBarController
:
extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext()! as CGContext
context.translateBy(x: 0, y: self.size.height)
context.scaleBy(x: 1.0, y: -1.0);
context.setBlendMode(CGBlendMode.normal)
let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
context.clip(to: rect, mask: self.cgImage!)
tintColor.setFill()
context.fill(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage
UIGraphicsEndImageContext()
return newImage
}
}