Je travaille sur demande qui est plus probablement un J'aimerais connaître la meilleure approche. Actuellement, mon approche est celle-ci (en utilisant S'il vous plaît dites-moi si je vais mal ou que je guide le meilleur moyen. Merci. P> TABBARCONTROLLER CODE> Application. Mais je ne peux pas utiliser le code> tabbarcontroller code> car j'ai besoin d'une onglet
personnalisé code> du gestionnaire en bas, j'ai également besoin d'espace personnalisé entre les éléments. Je crée donc la personnalisation
tabbarcontroller code>. p>
storyboard code> et
iOS6 code>): - j'ai pris un
uitoolbar code> sur
ViewController code> qui agira comme une barre inférieure
Barre CODE> (CustomTabBarViewController). J'ai pris
ContainViews code> pour chaque onglet. Lorsque l'utilisateur sélectionne un élément de la barre d'outils code>, je montrerai que
contenanterview code>. P>
4 Réponses :
Voici l'étape que vous devez suivre afin de faire la vue suivante: - p>
1: Prenez un uitabbarController et définissez-le comme RootViewController de la fenêtre de votre application. P>
2: Ajoutez maintenant cinq onglet à cette uitabbarController. p>
3: Ajoutez cinq UinavigationController à chaque onglet individuellement. P>
4: Ajoutez maintenant cinq différentes uiviewiPontrôleurs à l'UinavigationController respectivement. P>
5: Créez une barre d'onglets personnalisée maintenant: P>
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. P>
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. P>
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 Définir des balises pour tous , juste 1 à 5 tags, vous pouvez éventuellement le faire avec une sous-classe Custom mybaStabbarController.h p> mybaSetabbarController.m p> Tout d'abord, créez les contrôleurs de vue (qui sont tous 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>
p>
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>
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];
}
}
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]; code> - ressemble à une faute de frappe.
Pouvez-vous s'il vous plaît convertir cela au code SWIFT?
pour iOS 9.0+ Utilisez UISTACKView en direction horizontale et créez un XIB et nommé IT CustomTabBarView
CustomTabBarView.xib strong> Créer une autre vue CustomTabaritem. P> CustomTabbaritem.xib Strong>
Créer CustomTabaritem.swift Strong> Fichier pour implémenter la fonctionnalité de Tabitem P> p>
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
}
ci-dessous le code fonctionne parfaitement dans mon projet. strong> J'ai utilisé J'ai ajouté MyTabBar.xib. Contient UIView avec 4 boutons.
Dans XIB Fichier, définissez la classe d'UIView. classe = "mytabbar" et au-dessous de MyTabBarController Fichier P> MyTabBarController.swift code ci-dessous: P>
Donnez 4 boutons TAG 1,2,3,4 en conséquence .. 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()
}
Puis-je demander quelque chose lié à votre Personnalisé tabbarcontroller code>?