10

私はアプリケーションである可能性が高いアプリケーションに取り組んでいtabBarControllerます。しかし、下部にtabBarControllerカスタムハンドラーが必要であり、アイテム間にカスタムスペースが必要なため、を使用できません。tabだから私はカスタムを作成していますtabBarController

最善の方法を知りたいです。現在、私のアプローチはこれです(storyboardandを使用iOS6):-私は、ボトムバー(CustomTabBarViewController)として機能するものUIToolbarを取りました。タブごとに取りました。ユーザーがアイテムを選択すると、それが表示されます。ViewControllertabContainerViewstoolbarcontainerView

私が間違っているか、最善の方法を教えてください。ありがとう。

4

4 に答える 4

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

MYBaseTabBarController.m

まず、View Controller (この場合はすべてサブクラス) を作成し、それらをのサブクラスにプロパティとしてUINavigationController割り当てます。UITabBarControllerviewControllers

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

次に、前に作成したボタンを取得し、-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 を有効にしてプログラミングしていて、ストーリーボードを管理するクラスがあると仮定していますが、それはとにかく簡単です。

于 2013-05-03T10:09:20.700 に答える
0

次のビューを作成するために必要な手順は次のとおりです。

1: UITabBarController を取得し、アプリケーション ウィンドウの rootViewController として設定します。

2: この UITabbarController に Five Tab を追加します。

3: 5 つの個別の UINavigationController を各タブに個別に追加します。

4: 5 つの異なる UIViewControllers をそれぞれ UINavigationController に追加します。

5: 今すぐカスタム タブバーを作成します。

5.1 : カスタム Tabbar を作成する方法の 1 つは、Tabbar の高さの UIView を取得し、UIButtons を Tab として Tabbar に追加することです。

6: カスタム tabBar を MainWindow に追加します。カスタム タブバーでさまざまなボタンを選択すると、アプリケーションの UITabbarController の setSelectedIndex が変更されます。

于 2013-05-03T10:06:47.707 に答える