哪个是创build自定义标签栏控制器的最佳方法?

我正在处理更可能是一个tabBarController应用程序的应用程序。 但我不能使用tabBarController因为我需要一个自定义tab处理程序在底部也需要项目之间的自定义空间。 所以我正在创build自定义tabBarController

我想知道最好的方法。 目前我的方法是这样的(使用storyboardiOS6 ): – 我把一个UIToolbarViewController将作为一个底部tab栏(CustomTabBarViewController)。 我为每个选项卡采用ContainerViews 。 当用户selecttoolbar上的项目时,我将显示该containerView

请告诉我,如果我错了或指导最好的方法。 谢谢。

你这样做是非常错误的。 如果只使用默认视图层次结构,则不要创build自定义视图层次结构。

你想要做的是创build一个UITabBarController的子类,并创build一个.xib文件,将包含您的自定义标签栏 – 只是一个图像和任意数量的UIButtons(我想5)。

在这里输入图像说明

为它们设置标签,只需要1-5个标签,你可以用一个自定义的UIView子类来实现,但是在这种情况下这将是多余的,所以它只是用标签获取控件。

创buildUITabBarController的子类。 您需要引用所有这些button,并且还需要一个属性来查看最后按下哪个button,以便您可以适当地更新UI。 也为不同的控制状态分配不同的图像或标题,我在这种情况下使用默认和select。

MYBaseTabBarController.h

 @interface MYBaseTabBarController : UITabBarController @property (strong, nonatomic) UIButton *btn1; @property (strong, nonatomic) UIButton *btn2; @property (strong, nonatomic) UIButton *btn3; @property (strong, nonatomic) UIButton *btn4; @property (strong, nonatomic) UIButton *btn5; @property (weak, nonatomic) UIButton *lastSender; @property (strong, nonatomic) UIView *tabBarView; @end 

MYBaseTabBarController.m

首先,创build视图控制器(在这种情况下都是UINavigationController子类),并将它们作为viewControllers属性分配给你的UITabBarController的子类。

 - (id)init { self = [super init]; if (self) { [self setup]; } return self; } - (void)setup { NSMutableArray *viewControllers = [NSMutableArray array]; MYViewController1 *viewController1 = [[MYStoryboardManager storyboard1] instantiateInitialViewController]; viewController1.title = @"1"; [viewControllers addObject:viewController1]; MYViewController2 *viewController2 = [[MYStoryboardManager storyboard2] instantiateInitialViewController]; viewController2.title = @"2"; [viewControllers addObject:viewController2]; UIViewController *blankController = [UIViewController new]; // Center button, performs an action instead of leading to a controller [viewControllers addObject:blankController]; MYViewController3 *viewController3 = [[MYStoryboardManager storyboard3] instantiateInitialViewController]; viewController3.title = @"3"; [viewControllers addObject:viewController3]; MYViewController3 *viewController4 = [[MYStoryboardManager storyboard4] instantiateInitialViewController]; viewController4.title = @"4"; [viewControllers addObject:viewController4]; self.viewControllers = viewControllers; } 

接下来,抓住您之前创build的button,并在-viewDidLoad方法中为其分配操作:

 - (void)viewDidLoad { [super viewDidLoad]; _tabbarView = [[[NSBundle mainBundle] loadNibNamed:@"MyTabBar" owner:nil options:nil] lastObject]; // "MyTabBar" is the name of the .xib file _tabbarView.frame = CGRectMake(0.0, self.view.frame.size.height - _tabbarView.frame.size.height, _tabbarView.frame.size.width, _tabbarView.frame.size.height); // make it overlay your actual tab bar [self.view addSubview:_tabbarView]; _btn1 = (UIButton *)[_tabbarView viewWithTag:1]; [_btn1 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; _btn2 = (UIButton *)[_tabbarView viewWithTag:2]; [_btn2 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; _btn3 = (UIButton *)[_tabbarView viewWithTag:3]; [_btn3 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; _btn4 = (UIButton *)[_tabbarView viewWithTag:4]; [_btn4 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; _btn5 = (UIButton *)[_tabbarView viewWithTag:5]; [_btn5 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; _lastSender = _btn1; [self setSelectedViewController:self.viewControllers[0]]; // make first controller selected } 

添加处理方法:

 - (void)processBtn:(UIButton *)sender { _lastSender = sender; [self setSelectedViewController:[self.viewControllers objectAtIndex:sender.tag - 1]]; } 

最后重写-setSelectedViewController:方法:

 - (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]; } } 

我假设你使用ARC进行编程,并且你有一个pipe理你的故事板的类,但是这是非常简单的。

下面的代码在我的项目中完美工作。

我已经使用swift3版本如下:

我添加了包含UIView 4个button的MyTabBar.xib文件。 在xib文件中,设置UIView的类。 class =“MyTabBar”
给4个button相应地标记1,2,3,4。

和myTabBarController文件下面

myTabBarController.swift代码如下:

 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() } 

}

这样你可以根据你的需要devise自定义的tabbar。

谢谢

以下是您需要遵循的步骤,以便进行以下视图: –

1:取一个UITabBarController并将其设置为应用程序窗口的rootViewController。

2:现在添加五个选项卡到这个UITabbarController。

3:分别添加五个单独的UINavigationController到每个标签。

4:现在分别向UINavigationController添加五个不同的UIViewController。

5:现在创build一个自定义标签栏:

5.1:创build自定义Tabbar的方法之一是获取Tabbar高度的UIView,并将Tab作为Tab添加到Tabbar。

6:将Custom tabBar添加到MainWindow。 在select自定义选项卡上的各种button时,请更改应用程序UITabbarController的setSelectedIndex。

对于iOS 9.0+在水平方向使用UIStackView并创build一个xib并将其命名为CustomTabBarView

CustomTabBarView.Xib 在其中插入uistackview

像这样设置堆栈视图属性

创build另一个视图CustomTabBarItem。

CustomTabBarItem.xib 在这里输入图像说明

为TabItem的实现function创buildCustomTabBarItem.swift文件

 class CustomTabItem: UIView { //MARK:- IBOutlets @IBOutlet weak var itemImage: UIImageView! @IBOutlet weak var itemTitle: SelectableLabel! @IBOutlet weak var topButton: UIButton! //MARK:- Variables var isSelected: Bool = false { didSet { self.itemImage.image = CommonFunctions.getTabItemImage(isSelected: isSelected, tag: topButton.tag) itemTitle.isSelected = isSelected if isSelected { self.backgroundColor = UIColor.appDarkBlueColor } else { self.backgroundColor = UIColor.appWhiteColor } } } //MARK:- IBActions @IBAction func onClickButton(_ sender: Any) { } 

}

在TabBarViewController实现此代码

 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 }