10
votes

Quelle est la meilleure approche pour créer un contrôleur de barre d'onglets personnalisé?

Je travaille sur demande qui est plus probablement un TABBARCONTROLLER Application. Mais je ne peux pas utiliser le tabbarcontroller car j'ai besoin d'une onglet personnalisé du gestionnaire en bas, j'ai également besoin d'espace personnalisé entre les éléments. Je crée donc la personnalisation tabbarcontroller .

J'aimerais connaître la meilleure approche. Actuellement, mon approche est celle-ci (en utilisant storyboard et iOS6 ): - j'ai pris un uitoolbar sur ViewController qui agira comme une barre inférieure Barre (CustomTabBarViewController). J'ai pris ContainViews pour chaque onglet. Lorsque l'utilisateur sélectionne un élément de la barre d'outils , je montrerai que contenanterview .

S'il vous plaît dites-moi si je vais mal ou que je guide le meilleur moyen. Merci.


0 commentaires

4 Réponses :


0
votes

Voici l'étape que vous devez suivre afin de faire la vue suivante: -

1: Prenez un uitabbarController et définissez-le comme RootViewController de la fenêtre de votre application.

2: Ajoutez maintenant cinq onglet à cette uitabbarController.

3: Ajoutez cinq UinavigationController à chaque onglet individuellement.

4: Ajoutez maintenant cinq différentes uiviewiPontrôleurs à l'UinavigationController respectivement.

5: Créez une barre d'onglets personnalisée maintenant:

5.1: L'une des méthodes de création de tabbar personnalisées est de prendre un UIView de tabbar hauteur et d'ajouter UIButTons sous forme d'onglet dans la barre d'onglets.

6: ajoutez la barre d'onglets personnalisée sur le MainWindow. En choisissant Divers bouton de votre tabbar personnalisé, changez le SEselectedindex de votre application uitabbarcontroller.


0 commentaires

17
votes

Vous le faites très très mal. Ne créez pas une hiérarchie de vue personnalisée lorsque vous pouvez simplement utiliser l'une par défaut.

Ce que vous voulez faire est de créer une sous-classe de uitabbarcontroller code> et créez également un fichier .xib qui contiendra votre coutume Barre d'onglets - Tout simplement une image et une quantité arbitraire d'Uibuttons (je suppose 5). p>

Entrez la description de l'image ici p>

Définir des balises pour tous , juste 1 à 5 tags, vous pouvez éventuellement le faire avec une sous-classe Custom UIView code>, mais cela serait redondant dans ce scénario, il s'agirait donc de chercher des contrôles avec des étiquettes. P> Créer une sous-classe du uitabbarcontroller code>. Vous devrez avoir des références à tous ces boutons et également une propriété pour voir quel bouton a été enfoncé en dernier. Vous pouvez donc mettre à jour l'interface utilisateur de manière appropriée. Attribuez également différentes images ou titres pour différents états de contrôle, j'utilise par défaut et sélectionné dans ce cas. P>

mybaStabbarController.h p> xxx pré>

mybaSetabbarController.m p>

Tout d'abord, créez les contrôleurs de vue (qui sont tous UINAVIGATIONCONTROLLER CODE> dans ce cas) et attribuez-les à votre uitabbarcontroller code> S sous-classe ViewControlers Code> Propriété. P>

- (void)setSelectedViewController:(UIViewController *)selectedViewController {
  if (_lastSender != _btn3) { // check if it's not the action button
    for (UIButton *btn in [_tabbarView subviews]) {
      if ([btn isKindOfClass:[UIButton class]]) {
        if (btn == _lastSender) {
          btn.selected = YES;
        }
        else {
          btn.selected = NO;
        }
      }
    }
  }
  if ([self.viewControllers indexOfObject:selectedViewController] == 2) {
    MYActionController *viewController = [[MYStoryboardManager actionStoryboard] instantiateInitialViewController];
    [self presentViewController:viewController animated:YES completion:nil];
  }
  else {
    if (self.selectedViewController == selectedViewController) {
      [(UINavigationController *)self.selectedViewController popToRootViewControllerAnimated:animate]; // pop to root if tapped the same controller twice
    }
    [super setSelectedViewController:selectedViewController];
  }
}


3 commentaires

Cela devrait être la réponse sélectionnée car cela fonctionne parfaitement. Merci!


Ce que l'on entend par cette ligne dans la vue ViewDidLoad: [self.view _tabbarview]; - ressemble à une faute de frappe.


Pouvez-vous s'il vous plaît convertir cela au code SWIFT?



0
votes

pour iOS 9.0+ Utilisez UISTACKView en direction horizontale et créez un XIB et nommé IT CustomTabBarView

CustomTabBarView.xib strong>  insert uistackview en elle p>

 Définit les attributs de la vue de pile comme ceci p >

Créer une autre vue CustomTabaritem. P>

CustomTabbaritem.xib Strong> Entrez la description de l'image ici p>

Créer CustomTabaritem.swift Strong> Fichier pour implémenter la fonctionnalité de Tabitem P>

func createCustomTabBarView(tabItemCount: Int){

    customTabBarView = Bundle.main.loadNibNamed("CustomTabBarView", owner: nil, options: nil)?.last as! UIView
    customTabBarView.frame = CGRect(x: 0, y: self.view.frame.height - self.tabBar.frame.height, width: self.tabBar.frame.width, height: self.tabBar.frame.size.height)
    self.view.addSubview(customTabBarView)

    var stackView = UIStackView()
    for subView in customTabBarView.subviews{
        if subView is UIStackView {
            stackView = subView as! UIStackView
        }
    }

    for i in 0..<tabItemCount {
        let customTabItemView = Bundle.main.loadNibNamed("CustomTabItem", owner: nil, options: nil)?.last as! CustomTabItem
        switch i {
        case CustomTabbarButtonTag.TabBarItem_First.rawValue:
            customTabItemView.itemTitle.text = "TabBarItem_First"
            customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_First.rawValue
            customTabItemView.isSelected = false

        case CustomTabbarButtonTag.TabBarItem_Second.rawValue:
            customTabItemView.itemTitle.text = "TabBarItem_Second"
            customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Second.rawValue
            lastSelectedTabItem = customTabItemView
            customTabItemView.isSelected = true

        case CustomTabbarButtonTag.TabBarItem_Third.rawValue:
            customTabItemView.itemTitle.text = "TabBarItem_Third"
            customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Third.rawValue
            customTabItemView.isSelected = false

        case CustomTabbarButtonTag.TabBarItem_Fourth.rawValue:
            customTabItemView.itemTitle.text = "TabBarItem_Fourth" 
            customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Fourth.rawValue
            customTabItemView.isSelected = false
            cmsTabItem = customTabItemView

        default:
            break
        }

        customTabItemView.topButton.addTarget(self, action: #selector(tabBarButtonPressed), for: .touchUpInside)
        stackView.addArrangedSubview(customTabItemView)
    }
}

//MARK:- IBActions
func tabBarButtonPressed(_ sender: UIButton){
    // create global variable lastSelectedTabItem for store last selected tab item and set its isSelected value for manage highlight current selected tabItem
    lastSelectedTabItem.isSelected = false
    let customTabItem = sender.superview as! CustomTabItem
    lastSelectedTabItem = customTabItem
    lastSelectedTabItem.isSelected = true 
    self.selectedIndex = sender.tag
}


0 commentaires

4
votes

ci-dessous le code fonctionne parfaitement dans mon projet. strong>

J'ai utilisé Swift3 strong> Version ci-dessous: p>

J'ai ajouté MyTabBar.xib. Contient UIView avec 4 boutons. Dans XIB Fichier, définissez la classe d'UIView. classe = "mytabbar"
Donnez 4 boutons TAG 1,2,3,4 en conséquence .. p>

et au-dessous de MyTabBarController Fichier P>

MyTabBarController.swift code ci-dessous: P>

class myTabBarController: UITabBarController {

var tabBarView: UIView!

var btn1: UIButton!
var btn2: UIButton!
var btn3: UIButton!
var btn4: UIButton!

var lastSender: UIButton!

var categoryViewController: CategoryViewController?
var subCategoryViewController: SubCategoryViewController?
var scoreViewController: ScoreViewController?
var profileViewController: ProfileViewController?

override func viewDidLoad() {
    super.viewDidLoad()
    self.setup()

    tabBarView = Bundle.main.loadNibNamed("MyTabBar", owner: nil, options: nil)?.last as! UIView
    tabBarView.frame = CGRect(x: 0.0, y: self.view.frame.size.height - tabBarView.frame.size.height, width: tabBarView.frame.size.width, height: tabBarView.frame.size.height)
    self.view.addSubview(tabBarView)

    btn1 = tabBarView.viewWithTag(1) as? UIButton
    btn1.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside)
    btn2 = tabBarView.viewWithTag(2) as? UIButton
    btn2.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside)
    btn3 = tabBarView.viewWithTag(3) as? UIButton
    btn3.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside)
    btn4 = tabBarView.viewWithTag(4) as? UIButton
    btn4.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside)

    let width1 = self.view.frame.width/4
    btn1.frame = CGRect(x: 0, y: 0, width: width1, height: tabBarView.frame.size.height)
    btn2.frame = CGRect(x: btn1.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height)
    btn3.frame = CGRect(x: btn2.frame.origin.x+btn2.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height)
    btn4.frame = CGRect(x: btn3.frame.origin.x+btn3.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height)

    lastSender = btn1
    selectedViewController = viewControllers?[0]
}

func processBtn(_ sender: UIButton) {
    lastSender = sender
    selectedViewController = viewControllers?[sender.tag - 1]

    if sender.tag == 1 {
        btn1.backgroundColor = UIColor.red
        btn2.backgroundColor = UIColor.yellow
        btn3.backgroundColor = UIColor.yellow
        btn4.backgroundColor = UIColor.yellow
    }else if sender.tag == 2 {
        btn1.backgroundColor = UIColor.yellow
        btn2.backgroundColor = UIColor.red
        btn3.backgroundColor = UIColor.yellow
        btn4.backgroundColor = UIColor.yellow
    }else if sender.tag == 3 {
        btn1.backgroundColor = UIColor.yellow
        btn2.backgroundColor = UIColor.yellow
        btn3.backgroundColor = UIColor.red
        btn4.backgroundColor = UIColor.yellow
    }else if sender.tag == 4 {
        btn1.backgroundColor = UIColor.yellow
        btn2.backgroundColor = UIColor.yellow
        btn3.backgroundColor = UIColor.yellow
        btn4.backgroundColor = UIColor.red
    }
}

func setup() {
    var viewControllers = [AnyObject]()

    categoryViewController = self.storyboard!.instantiateViewController(withIdentifier: "CategoryViewController") as? CategoryViewController
    viewControllers.append(categoryViewController!)

    subCategoryViewController = self.storyboard!.instantiateViewController(withIdentifier: "SubCategoryViewController") as? SubCategoryViewController
    viewControllers.append(subCategoryViewController!)

    scoreViewController = self.storyboard!.instantiateViewController(withIdentifier: "ScoreViewController") as? ScoreViewController
    viewControllers.append(scoreViewController!)

    profileViewController = self.storyboard!.instantiateViewController(withIdentifier: "ProfileViewController") as? ProfileViewController
    viewControllers.append(profileViewController!)

    self.viewControllers = viewControllers as? [UIViewController]
}

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

    for view in tabBarView.subviews as [UIView] {
        if let btn = view as? UIButton {
            if btn == lastSender {
                btn.isSelected = true
            }
            else {
                btn.isSelected = false
            }
        }
    }

    if self.selectedViewController == viewController {
        (self.selectedViewController as? UINavigationController)?.popToRootViewController(animated: true)
        // pop to root if tapped the same controller twice
    }

    return (viewController != tabBarController.selectedViewController)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


1 commentaires

Puis-je demander quelque chose lié à votre Personnalisé tabbarcontroller ?