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

Ame*_*has 9 objective-c uitabbarcontroller ios

我正在开发更有可能是tabBarController应用程序的应用程序.但我不能使用,tabBarController因为我需要tab在底部的自定义处理程序,我需要项目之间的自定义空间.所以我正在创建自定义tabBarController.

我想知道最好的方法.目前,我的做法是在这种方式(使用storyboardiOS6): -我花了一个UIToolbar关于ViewController其将作为底行动tab吧(CustomTabBarViewController).我拿了ContainerViews每个标签.当用户选择一个项目时toolbar,我会显示containerView.

请告诉我,如果我出错或指导最佳方式.谢谢.

Eug*_*ene 17

你这样做非常错误.如果只能使用默认视图层次结构,请不要创建自定义视图层次结构.

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

在此输入图像描述

为所有这些标签设置标签,只需1-5个标签,您可以使用自定义UIView子类来完成,但在这种情况下这将是多余的,因此它只是用标签获取控件.

创建一个子类UITabBarController.您需要引用所有这些按钮以及属性以查看最后按下了哪个按钮,因此您可以适当地更新UI.还为不同的控制状态分配不同的图像或标题,我使用默认值并在这种情况下选择.

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
Run Code Online (Sandbox Code Playgroud)

MYBaseTabBarController.m

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

- (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;
}
Run Code Online (Sandbox Code Playgroud)

接下来抓住您之前创建的按钮,并在-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
}
Run Code Online (Sandbox Code Playgroud)

添加处理方法:

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

最后覆盖-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];
  }
}
Run Code Online (Sandbox Code Playgroud)

我假设您正在使用ARC进行编程,并且您有一个管理故事板的课程,但无论如何这都非常简单.

  • viewDidLoad中的这一行是什么意思:`[self.view _tabbarView];` - 看起来像一个错字. (3认同)

Gau*_*ogi 0

为了获得以下视图,您需要遵循以下步骤:-

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

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

3:为每个Tab单独添加5个独立的UINavigationController。

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

5:立即创建自定义选项卡栏:

5.1:创建自定义Tabbar的方法之一是采用Tabbar高度的UIView并将UIButtons作为Tab添加到Tabbar。

6:将自定义 tabBar 添加到 MainWindow 上。在自定义选项卡栏上选择各种按钮时,更改应用程序 UITabbarController 的 setSelectedIndex。