web-dev-qa-db-fra.com

Couleurs par défaut des éléments de la barre d'onglets en utilisant Swift Xcode 6

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

18
Nick Germi

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

55
Keenle

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!

5
pulp

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)
4
Eli Stone

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
 }
}
3
Dasoga