[Swift] Personnaliser Tab Bar

CusmarCusmar Membre
juillet 2015 modifié dans API UIKit #1

Bonjour,


 


J'ai un petit problème. Je souhaite modifier la Tab Bar basique d'Apple en retirant entre autre les titres. J'ai lu presque toutes les questions possibles sur le sujet sur StackOverflow mais la seule solution viable ne fonctionne pas, et j'aimerais comprendre pourquoi.


 


J'ai mis ce code dans mon AppDelegate pour tenter de modifier déjà  la première image :


l



var tabBarItem1 = UITabBarItem(title: nil, image: UIImage(named: "TabBar_feed"), tag: 0)
tabBarItem1.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)

l


Autre chose : je ne parviens pas à  rendre l'item non-sélectionné blanc, il est toujours gris. Peut-être qu'en réussissant à  importer l'image de cette manière (code ci-dessus), le blanc sera pris en compte (mon item est blanc).


Réponses

  • Il fonctionne très bien ton code. Je viens de le tester (Xcode 6.4). Quoi que le centrage vertical ne soit pas parfait. C'est mieux de décaler l'icône de 4 pixels au lieu de 6. Enfin ça dépend aussi de l'icône.



    let icone = UIImage(named:"book")
    let tbi = UITabBarItem(title: nil, image: icone, tag: 1)
    tbi.imageInsets = UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0)

  • CusmarCusmar Membre
    juillet 2015 modifié #3

    Alors là  je ne comprends pas, moi rien ne bouge quoi que je fasse... Tu l'as mis à  quel endroit dans ton AppDelegate ?


     


    Ce que j'écris n'a pas l'air d'avoir d'effet.


  • DrakenDraken Membre
    juillet 2015 modifié #4

    Pour tester ton code, j'ai repris un exemple du cours de programmation iOS8 du professeur Kordon de Jussieu, dont les vidéos traitant de TabBar sont :


     


    (théorie)


    http://pagesperso-systeme.lip6.fr/Fabrice.Kordon/5I452-2014/index.php?C=08&S=09


     


    (un exemple en Swift)


    http://pagesperso-systeme.lip6.fr/Fabrice.Kordon/5I452-2014/index.php?C=08&S=10


     


    Ma version simplifiée (Swift et Xcode 6.4) utilisant ton code pour afficher des items sans titre :



    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let vc1 = ViewController1(nibName: nil, bundle: nil)
    let vc2 = ViewController2(nibName: nil, bundle: nil)
    let tbc = UITabBarController()
    tbc.viewControllers = [vc1, vc2]
    window?.rootViewController = tbc
    return true
    }



    class ViewController1: UIViewController {

    private let l = UILabel()

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    let icone = UIImage(named:"book")
    let tbi = UITabBarItem(title: nil, image: icone, tag: 1)
    tbi.imageInsets = UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0)
    self.tabBarItem = tbi
    }

    required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }


    override func viewDidLoad() {
    super.viewDidLoad()

    self.view = UIView(frame:UIScreen.mainScreen().bounds)
    self.view.backgroundColor = UIColor.yellowColor()
    l.text = "Première vue"
    l.textAlignment = .Center
    self.view.addSubview(l)
    self.redessine(UIScreen.mainScreen().bounds.size)
    }

    func redessine(size:CGSize) {
    l.frame = CGRectMake(10.0, 70.0, size.width - 20.0, 20.0)
    }

    // Mise à  jour de l'interface après une rotation (iOS 8 seulement)
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    self.redessine(size)
    }

    }



    class ViewController2: UIViewController {

    private let l = UILabel()

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    let icone = UIImage(named:"pref")
    let tbi = UITabBarItem(title: nil, image: icone, tag: 2)
    tbi.imageInsets = UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0)
    self.tabBarItem = tbi
    }

    required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
    super.viewDidLoad()

    self.view = UIView(frame:UIScreen.mainScreen().bounds)
    self.view.backgroundColor = UIColor.cyanColor()
    l.text = "Seconde vue"
    l.textAlignment = .Center
    self.view.addSubview(l)
    self.redessine(UIScreen.mainScreen().bounds.size)
    }

    func redessine(size:CGSize) {
    l.frame = CGRectMake(10.0, 70.0, size.width - 20.0, 20.0)
    }

    // Mise à  jour de l'interface après une rotation (iOS 8 seulement)
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    self.redessine(size)
    }
    }


    L'exemple gère la rotation en utilisant la fonction viewWillTransitionToSize apparu avec iOS 8. 

  • Merci beaucoup !


     


    Et je vais passer faire un tour sur le lien de ta signature, la dernière fois que j'avais voulu y aller, il ne fonctionnait pas. :)


  • DrakenDraken Membre
    juillet 2015 modifié #6

     Le lien sur ma signature pointe sur les vidéos du professeur Kordon, stockées sur les serveurs de l'université Jussieu (Paris). Elles n'étaient plus disponibles, suite à  un incendie dans la salle des onduleurs (merci la canicule). C'est réparé maintenant.

  • Parfait, merci alors :)


Connectez-vous ou Inscrivez-vous pour répondre.