2013-05-03 7 views
6

私はもっと可能性の高いアプリケーションで作業していますtabBarControllerアプリケーション。しかし、tabBarControllerを使用することはできません。私はカスタムtabハンドラが必要です。また、アイテム間にカスタムスペースが必要です。だから私はカスタムを作成していますtabBarControllerカスタムタブバーコントローラを作成する最良の方法はどれですか?

私は最良のアプローチを知りたいと思います。現在のところ、私のアプローチは(storyboardiOS6を使用して)これになります: - でUIToolbarをとりました。これは、下部のtabバー(CustomTabBarViewController)として機能します。各タブごとにContainerViewsを取得しました。ユーザーがtoolbarのアイテムを選択すると、そのアイテムはcontainerViewと表示されます。

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

答えて

0

次のビューを作るためにに従う必要がある手順は以下のとおりです。 -

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

2:このUITabbarControllerに5つのタブを追加します。

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

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

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

5.1:カスタムタブバーを作成する方法の一つは、TabBarの高さのUIViewのを取り、タブバーにタブとしてUIButtonsを追加することです。

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

15

あなたは非常に間違っています。デフォルトのビュー階層だけを使用できる場合は、カスタムビュー階層を作成しないでください。

UITabBarControllerのサブクラスを作成し、カスタムタブバーを含む.xibファイルを作成するだけです。イメージと任意の量のUIButtons(私は5)を作成します。それらのすべてのための

enter image description here

セットタグ、ちょうど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

まず、ビューコントローラ(この場合はすべて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; 
} 

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

+0

これは完全に機能するため、これが選択された回答になります。ありがとう! –

+3

viewDidLoadのこの行の意味は次のとおりです。 '[self.view _tabbarView];'は、タイプミスのようです。 – inorganik

0
水平方向にIOS 9.0以降 使用UIStackViewについては

とXIBを作成し、CustomTabBarView

それを命名

CustomTabBarView.Xibinsert uistackview in it

Set Stack view attributes like this

別のビューCustomTabBarItemを作成します。

CustomTabBarItem.xib enter image description here

のTabItem

TabBarViewControllerで
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) { 

} 

}

このコード

012を実装する機能を実装するための CustomTabBarItem.swiftファイルを作成します
2

以下のコードは私のプロジェクトでは完全に機能します。

私は以下のようにswift3バージョンを使用しています

iは、4つのボタンでのUIViewが含まれているMyTabBar.xibファイルを追加しました。 xibファイルで、UIViewのクラスを設定します。

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

}

:クラス= "MyTabBar"
は、タグがそれに応じて..

とmyTabBarController以下

は、以下のように

myTabBarController.swiftコードファイル1,2,3,4 4つのボタンを与えます

この方法で、必要に応じてカスタムタブバーをデザインできます。

ありがとうございました

関連する問題