web-dev-qa-db-fra.com

IOS 8 Couleur d'arrière-plan de l'élément de la barre d'onglets

J'essaie de trouver la solution à ce problème depuis une semaine et je n'ai pas eu de chance après avoir essayé toutes les solutions possibles que je pouvais trouver ou auxquelles je pouvais penser. Chaque solution que j'ai trouvée et que j'ai essayée n'a pas fonctionné ou est obsolète.

J'ai 5 UITabBarItem 'dans un UITabBar placé dans UITabBarController. Je souhaite modifier la couleur d'arrière-plan de la variable UITabBarItem lorsqu'elle est sélectionnée et, bien sûr, la faire revenir lorsque l'élément sélectionné change. 

J'utilise Swift et iOS SDK 8.3 dans Xcode 6.3.1. Si vous ne pouvez répondre qu’à l’objectif C, c’est bien aussi, toute réponse sera utile! Merci à tous d'avance, je l'apprécie vraiment!

EDIT: Voici un exemple visuel de ce que je voudrais qu'il fasse.

Couleur de fond différente

17
user2985289

Dans votre tabBarController, vous pouvez définir les teintes par défaut UITabBar, barTintColor, selectionIndicatorImage (tricher un peu ici) et renderingMode des images.

    class MyTabBarController: UITabBarController, UINavigationControllerDelegate {
      ...
      override func viewDidLoad() {
        ...
        // Sets the default color of the icon of the selected UITabBarItem and Title
        UITabBar.appearance().tintColor = UIColor.redColor()

        // Sets the default color of the background of the UITabBar
        UITabBar.appearance().barTintColor = UIColor.blackColor()

        // Sets the background color of the selected UITabBarItem (using and plain colored UIImage with the width = 1/5 of the tabBar (if you have 5 items) and the height of the tabBar)
        UITabBar.appearance().selectionIndicatorImage = UIImage().makeImageWithColorAndSize(UIColor.blueColor(), size: CGSizeMake(tabBar.frame.width/5, tabBar.frame.height))

        // Uses the original colors for your images, so they aren't not rendered as grey automatically.
        for item in self.tabBar.items as! [UITabBarItem] {
          if let image = item.image {
            item.image = image.imageWithRenderingMode(.AlwaysOriginal)
          }
        }
      }
      ...
    }

Et vous voudrez étendre la classe UIImage pour créer l’image couleur unie avec la taille dont vous avez besoin:

extension UIImage {
  func makeImageWithColorAndSize(color: UIColor, size: CGSize) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(CGRectMake(0, 0, size.width, size.height))
    var image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
  }
}
62
Gwendle

Vous pouvez essayer celui-ci. Ajoutez ceci dans AppDelegate.Swift.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        UITabBar.appearance().translucent = false
        UITabBar.appearance().barTintColor = UIColor(rgba: "#12296f")
        UITabBar.appearance().tintColor = UIColor.whiteColor()

        return true
    }

N'oubliez pas d'inclure cette bibliothèque. https://github.com/yeahdongcn/UIColor-Hex-Swift

19
Mohammad Nurdin

Inspiré par Gwendle, voici comment j'ai résolu le problème:

override func viewWillAppear(animated: Bool) {
    guard let tabBar = tabBarController?.tabBar else { return }
    tabBar.tintColor = UIColor.whiteColor()
    tabBar.selectionIndicatorImage = UIImage().makeImageWithColorAndSize(UIColor.redColor(), size: CGSizeMake(tabBar.frame.width/5, tabBar.frame.height))
    super.viewWillAppear(animated)
}

Et aussi utilisé l'extension:

extension UIImage {
    func makeImageWithColorAndSize(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContext(size)
        color.setFill()
        UIRectFill(CGRectMake(0, 0, size.width, size.height))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
}

Gardez à l'esprit qu'après avoir défini la variable selectionIndicationImage, elle reste définie pour tous vos autres onglets. Voici un exemple pour le supprimer en définissant ce paramètre sur nil dans tous les autres contrôleurs de vue des autres onglets:

override func viewWillAppear(animated: Bool) {
    tabBarController?.tabBar.tintColor = UIColor.redColor()
    tabBarController?.tabBar.selectionIndicatorImage = nil
    super.viewWillAppear(animated)
}

Mis en œuvre avec Swift 2.

4
Andrej

Vous pouvez appeler cette fonction à partir de chaque contrôleur en passant self.tabBarController et chaque couleur souhaitée.

Une fonction :

static func customTabBar(controller: UIViewController?, backgroundColor: String, unselectedColor: String, selectedColor: String) {
        if let tabBarController = controller as? UITabBarController {
            tabBarController.tabBar.barTintColor = UIColor(hex: backgroundColor)
            tabBarController.tabBar.tintColor = UIColor(hex: selectedColor)
            tabBarController.tabBar.isTranslucent = false
            tabBarController.tabBar.selectedItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor(hex: selectedColor)], for: UIControl.State.selected)
            if #available(iOS 10.0, *) {
                tabBarController.tabBar.unselectedItemTintColor = UIColor(hex: unselectedColor)
            } else {
                // Fallback on earlier versions
            }
        }
    }
0
MichelRobico

Avez-vous essayé cela?

Sélectionnez l'image de l'icône de la barre d'onglets dans votre contrôleur de vue dans le storyboard. 

Regardez dans l'onglet Identité et Type (extrême gauche) (cela ressemble à un morceau de papier) sur le panneau droit de xcode.

Recherchez le paramètre de teinte global.

0
Garret