カスタム UITabBarController を作成しようとしているので、コンテナ ビュー コントローラを使用する必要があります。それを行うには:
- ストーリーボードを開き、カスタム UIVIewController (ContainerViewController と呼びましょう) を追加します。
- タブを表す UIVIew をそのコントローラーに挿入してから、画面の残りの部分を占める別の UIVIew (以下のコードでは *currentView) を挿入します。これは、子コントローラーがシーンを表示するために使用するものです。
- 通常どおり、必要なシーン (子コントローラー) ごとに UIVIewController を作成し、それぞれに一意の識別子を付けます (Identity Inspector -> Storyboard ID)。
次のコードを ContainerViewController に追加する必要があります。
@interface ContainerViewController ()
@property (strong, nonatomic) IBOutlet UIView *currentView; // Connect the UIView to this outlet
@property (strong, nonatomic) UIViewController *currentViewController;
@property (nonatomic) NSInteger index;
@end
@implementation ContainerViewController
// This is the method that will change the active view controller and the view that is shown
- (void)changeToControllerWithIndex:(NSInteger)index
{
if (self.index != index){
self.index = index;
[self setupTabForIndex:index];
// The code below will properly remove the the child view controller that is
// currently being shown to the user and insert the new child view controller.
UIViewController *vc = [self setupViewControllerForIndex:index];
[self addChildViewController:vc];
[vc didMoveToParentViewController:self];
if (self.currentViewController){
[self.currentViewController willMoveToParentViewController:nil];
[self transitionFromViewController:self.currentViewController toViewController:vc duration:0 options:UIViewAnimationOptionTransitionNone animations:^{
[self.currentViewController.view removeFromSuperview];
[self.currentView addSubview:vc.view];
} completion:^(BOOL finished) {
[self.currentViewController removeFromParentViewController];
self.currentViewController = vc;
}];
} else {
[self.currentView addSubview:vc.view];
self.currentViewController = vc;
}
}
}
// This is where you instantiate each child controller and setup anything you need on them, like delegates and public properties.
- (UIViewController *)setupViewControllerForIndex:(NSInteger)index {
// Replace UIVIewController with your custom classes
if (index == 0){
UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"STORYBOARD_ID_1"];
return child;
} else {
UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"STORYBOARD_ID_2"];
return child;
}
}
// Use this method to change anything you need on the tabs, like making the active tab a different colour
- (void)setupTabForIndex:(NSInteger)index{
}
// This will recognize taps on the tabs so the change can be done
- (IBAction)tapDetected:(UITapGestureRecognizer *)gestureRecognizer {
[self changeToControllerWithIndex:gestureRecognizer.view.tag];
}
最後に、タブを表す作成する各ビューには、独自の TapGestureRecognizer とそのタグの番号が必要です。
これらすべてを行うことで、必要なボタンを備えた単一のコントローラーが作成され (再利用可能である必要はありません)、必要なだけ多くの機能をそれらに追加できます (これが setupTabBarForIndex: メソッドが使用されるものです)。 DRYに違反しないでください。